我在节点js API中得到ERR_STREAM_WRITE_AFTER_END。如何解决这个问题?

时间:2019-06-03 06:49:29

标签: javascript node.js express

我从ui上载上传文件api时遇到以下问题。我正在从react js命中节点js api,然后从node js命中公共api。 enter image description here

  

节点版本:-10.15.3

     

npm版本:-6.4.1

Api

router.route("/uploadLocaleFile").post(function(req, res, next) {
  req.on("data", data => {
    uploadFile(req, data, res);
  });
});

function uploadFile(req, data, res) {
  request
    .post({
      uri: `${notebookPath}/localfile/${req.query.experimentId}`,
      body: data,
      headers: {
        "Content-Type": req.headers["content-type"],
        Authorization: req.headers["authorization"]
      }
    })
    .pipe(res);
}

2 个答案:

答案 0 :(得分:2)

尝试此代码

router.route("/uploadLocaleFile").post(function(req, res, next) {
  const chunks = [];
  req
    .on('data', data => chunks.push(data))
    .on("end", _ => uploadFile(req, Buffer.concat(chunks), res)
  ;
});

function uploadFile(req, data, res) {
  request
    .post({
      uri: `${notebookPath}/localfile/${req.query.experimentId}`,
      body: data,
      headers: {
        "Content-Type": req.headers["content-type"],
        Authorization: req.headers["authorization"]
      }
    })
    .pipe(res);
}

答案 1 :(得分:1)

您可能想尝试@Yaroslav Gaponov解决方案。

您的问题是.pipe(res)在每个data事件上触发。到您的第二个data事件发生时,res流已经关闭。

@Yaroslav Gaponov所做的是,在每个data事件中,他将传入的缓冲区存储到一个数组中。流完成后,将发出end事件,只有这样,您才可以对res进行1次写入,即 uploadFile .pipe(res) >。

您也可以像这样尝试request一根管道:

  

req.pipe(request(your_options))。pipe(res)