【发布时间】:2018-02-01 00:59:51
【问题描述】:
我正在尝试将文件从服务 A 通过服务 B 传输到我的 Postman 客户端。服务 A 构建一个交付 CSV 文件,服务 B (nodejs) 必须通过管道传输到我的客户端。
经过大量研究,我成功地将文件传输到服务 B,然后传输到 Postman。现在我想处理丑陋的情况:如果请求令牌无效怎么办?如果找不到文件怎么办?
到目前为止,我发现零个文档或示例说明如何在使用 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);
});
});
}
此代码正确处理文件的创建。当我伪造令牌或拼错授权标头时,我会得到正确的 401 响应,但无论如何都会写入一个文件,其内容是身份验证错误。
无论如何都可以给我一个提示:
- 真正捕获和管理失败时的请求
- 在这种情况下,如何通过返回 express 上下文并仅返回失败的 express 请求来逃避管道?
非常感谢!
【问题讨论】:
标签: node.js express pipeline superagent