我正在尝试将服务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响应,但无论如何都会写入一个文件,其内容是身份验证错误。
无论如何可以给我一个关于如何:
的提示非常感谢!
答案 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"。它可以通过承诺让一切变得更轻松。