' Path必须是没有空字节的字符串'当管道流要求时

时间:2016-10-03 06:29:24

标签: javascript node.js request base64 restify

我有一个从base64 enconded图像创建的缓冲区。我试图用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将文件内容发送到第三方服务。

当我读到这篇文章时,有几个消息来源说我应该创建一个"可读流"使用Buffer-object并将其传递给将其发送给第三方服务的请求。

因此,我从base64编码的图像创建一个Buffer,并将其作为参数发送到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

来自请求模块docs的引用:

  

您还可以将文件流式传输到PUT或POST请求。此方法还将根据文件扩展名到内容类型(在本例中为application / json)的映射检查文件扩展名,并在PUT请求中使用正确的内容类型(如果标题尚未提供)。 / p>      

fs.createReadStream(' file.json&#39)。管(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
      }
    };
  }




1 个答案:

答案 0 :(得分:0)

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);
         });
});