在管道

时间:2018-01-31 15:00:31

标签: node.js express pipeline superagent

我正在尝试将服务A中的文件通过服务B传输到我的Postman客户端。服务A构建一个提供CSV文件,服务B(nodejs)必须管道进入我的客户端。

经过大量的研究,我成功地将文件传输到服务B然后进入邮递员。现在我想处理丑陋的案例:如果请求令牌无效怎么办?如果找不到文件怎么办?

到目前为止,我找到了零文档或示例,说明在使用superagent处理请求时如何成功处理错误。

这就是我目前所拥有的

router.post("/csv", (req, res) => {
  download_csv(req.get("Authorization"), req.body.ids)
  .then((response) => {
    res.sendFile(path.resolve(response));
  })
  .catch((err) => {
    res.status(error.status).json(error.response.body);
  })   
});

function download_csv(token, ids) {
  const stream = fs.createWriteStream("filters.csv")
  let request = agent
    .post(`${profiles}/api/documents/csv`)
    .set("authorization", token)
    .send({
      ids: ids,
      action: DOWNLOAD_CSV_PROFILES
    })

  request.on("response", res => {
    // Maybe I can use abort to handle this thing, but can't figure out how!
    // if (res.status !== 200) request.abort()
    console.log(res.status)
  })

  request.on("abort", () => {
    console.log("aborted")
    return new Promise((resolve, reject) => {
      resolve("request aborted")
    })
  })

  request.pipe(stream)
  return streamToPromise(stream);
}

function streamToPromise(stream) {
  return new Promise((resolve, reject) => {
    stream.on("error", (err) => {
      console.log("error in error")
    })
    stream.on("finish", () => {
      console.log("File saved")
      resolve(stream.path);
    });
  });
}

此代码处理正确文件的创建。当我伪造令牌或拼错Authorization标头时,我得到了正确的401响应,但无论如何都会写入一个文件,其内容是身份验证错误。

无论如何可以给我一个关于如何:

的提示
  • 实际上在失败时捕获并管理请求
  • 在这种情况下,如何通过返回快递上下文并仅返回失败的快递请求来逃避管道?

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,只需在on(' response')中创建fs写入流并对结果进行小修改。

function download_csv(token, ids) {
    return new Promise((resolve, reject) => {
      let request = agent
        .post(`${profiles}/api/documents/csv`)
        .set("authorization", token)
        .send({
          ids: ids,
          action: DOWNLOAD_CSV_PROFILES
        })

      request.on("response", res => {
        // Maybe I can use abort to handle this thing, but can't figure out how!
        if (res.status === 200) {
            res
              .on("end", resolve)
              .pipe(fs.createWriteStream("filters.csv"));
        } else {
          reject();
        }
      })

      request.on("abort", reject);

  });
}

我不确定"请求是什么"您正在使用 - 但假设它实际上是请求npm模块将有所帮助。

理想情况下,将文件上传到临时目录并在解析承诺时移动它,删除时拒绝。这样您就可以解决部分下载的问题。

如果您想进行任何动态转换,请查看我的" scramjet"。它可以通过承诺让一切变得更轻松。