gpt4 book ai didi

javascript - 当通过管道传输请求时,“路径必须是没有空字节的字符串”

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:24 24 4
gpt4 key购买 nike

我有一个从 Base64 编码图像创建的缓冲区。我尝试使用 POST 发送到 fs.createReadStream(..).pipe(request(..)) 的服务,但出现以下错误:

 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 中的一个错误吗?

更多详细信息:

我有一个使用 Restify 构建的 Node 服务。该服务有一个端点,它接受主题、消息、名称和 base64 编码的图像文件(jpg、png 等)。

现在我们想使用 Node 中的 JavaScript 将文件的内容发送到第三方服务。

当我读到这一点时,有几个消息来源说我应该使用缓冲区对象创建一个“可读流”,并将其通过管道传输到将其发送到第三方服务的请求。

因此,我从 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
}
};
}

最佳答案

fs.createReadStream() 总是将文件路径作为其第一个参数。看起来您实际上正在将某个二进制文件的内容作为 fs.createReadStream() 的文件路径参数传递。如果我的假设是正确的,那么您只需要将 Buffer 作为主体传递给 request() ,如下所示:

return new Promise((resolve, reject) => {
fileUploadOptions.body = fileBuffer;
request.post(fileUploadOptions)
.on('response', (response) => {
resolve(response);
})
.on('error', (error) => {
reject(error);
});
});

关于javascript - 当通过管道传输请求时,“路径必须是没有空字节的字符串”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39825653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com