У меня есть буфер, созданный из изображения с базой 64. Im пытается отправить с POST на службу с fs.createReadStream (..) труба (запрос (..)), но получаю следующее сообщение об ошибке:.«Путь должен быть строкой без нулевых байтов», когда поток трубопровода для запроса
Error: Path must be a string without null bytes
at nullCheck (fs.js:135:14)
at Object.fs.open (fs.js:626:8)
at ReadStream.open (fs.js:1916:6)
at new ReadStream (fs.js:1903:10)
at Object.fs.createReadStream (fs.js:1850:10)
at Promise (/Users/Sebbe/Documents/Code/leo-faq-service/lib/server/services/zendesk-service.js:120:10)
[...]
fs.createReadStream() принимает либо строки или Буфер. Если это строка, то предполагается, что это путь к файлу. Мне кажется, что fs.createReadStream() пытается разрешить аргумент как строку, содержащую путь, даже если это буфер. Возможно, это ошибка в Nodes Buffer API?
Подробнее:
У меня есть сервис Node построен с Restify. Эта служба имеет конечную точку, которая принимает объект, сообщение, имя и файл с кодировкой base64 (jpg, png и т. Д.).
Теперь мы хотим отправить содержимое файла третьей стороне с использованием JavaScript в узле.
Когда я прочитал об этом, есть несколько источников, в которых говорится, что я должен создать «Readable Stream» с буфером-объектом и передать его на запрос, отправляющий его третьей стороне.
Из-за этого я создаю буфер из моего кодированного изображения base64 и отправляю его как аргумент fs.createReadStream, который затем передаю в объект запроса.
В соответствии с этим я должен быть в состоянии создать буфер из base64 строки: https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding
В соответствии с этим я должен быть в состоянии создать читаемый поток из буфера: https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options
И в соответствии с этим Я должен быть в состоянии использовать модуль запроса к трубе буфера к POST-запроса: https://www.npmjs.com/package/request
Цитата из запроса модуля документации:
You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case application/json) and use the proper content-type in the PUT request (if the headers don’t already provide one).
fs.createReadStream('file.json').pipe(request.put(url))
_postFile(base64FileContent) {
const fileBuffer = Buffer.from(base64FileContent, 'base64');
const fileUploadOptions = this._getRequestPostFileOptions('uploads', fileBuffer.length);
return new Promise((resolve, reject) => {
fs.createReadStream(fileBuffer)
.pipe(request.post(fileUploadOptions)
.on('response', (response) => {
resolve(response);
})
.on('error', (error) => {
reject(error);
})
);
});
}
_getRequestPostFileOptions(resourceName, dataLength) {
return {
uri : url.parse(`${this.coreBaseUrl}/${resourceName}`),
timeout : RequestTimeout,
method : 'POST',
headers : {
'Authorization' : `Basic ${this.auth}`,
'Content-Type' : 'application/binary',
'Content-Length' : dataLength
}
};
}
Что делает это возвращение 'url.parse ('$ {this.coreBaseUrl}/$ {ResourceName} ') '? –
пример: this.coreBaseUrl = 'http://www.url.to/api' resourceName = 'articles' или 'user' or 'comments' Затем я использую url.parse (..) для объединения оба действительны для URL. – Spetastium
Можете ли вы подтвердить, будет ли он передаваться в виде строки после того, как вы выполните 'url.parse (..)'? –