gpt4 book ai didi

node.js - 在管道传输之前捕获 super 代理请求错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:06 24 4
gpt4 key购买 nike

我正在尝试将文件从服务 A 通过服务 B 传输到我的 Postman 客户端。服务 A 构建并交付 CSV 文件,服务 B (nodejs) 必须通过管道传输到我的客户端。

经过大量研究后,我成功地将文件传输到服务 B,然后传输到 Postman。现在我想处理丑陋的情况:如果请求 token 无效怎么办?如果我找不到该文件怎么办?

到目前为止,我发现了零个有关如何在使用 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);
});
});
}

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

无论如何可以给我一个关于如何做的提示:

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

非常感谢!

最佳答案

如果我理解正确的话,只需在 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);

});
}

我不确定您正在使用的“请求”是什么 - 但假设它实际上是 request npm 模块,会有帮助。

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

如果您想进行任何即时转换,请查看我的“scramjet ”。有了 promise ,一切都会变得更容易。

关于node.js - 在管道传输之前捕获 super 代理请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com