Javascript 使用nodejs捕获下载文件的错误消息
我正在从nodejs下载一个文件 当后端出现错误时,我需要向前端发送消息 我的问题是我无法捕获该消息 我知道在后端使用blob和json存在一些问题 但我没有解决它 我的代码行:Javascript 使用nodejs捕获下载文件的错误消息,javascript,node.js,vue.js,Javascript,Node.js,Vue.js,我正在从nodejs下载一个文件 当后端出现错误时,我需要向前端发送消息 我的问题是我无法捕获该消息 我知道在后端使用blob和json存在一些问题 但我没有解决它 我的代码行: console.log(error.response.data.message) allways返回“未定义” 首先,代码中有一些错误: 。。。 试一试{ //您必须告诉axios如何使用`responseType处理响应` let response=wait axios.post('/generateLoteXML
console.log(error.response.data.message)
allways返回“未定义”
首先,代码中有一些错误:
。。。
试一试{
//您必须告诉axios如何使用`responseType处理响应`
let response=wait axios.post('/generateLoteXMLZIPConsulta');
//不用在这里等待
让blob=等待新blob([response.data]{
类型:“应用程序/zip”,
});
const link=document.createElement(“a”);
//不需要,因为您没有将此元素附加到DOM中
link.style.display=“无”;
link.href=window.URL.createObjectURL(blob);
const fileName=response.headers[“内容处置”]。匹配(
/文件名=(*)/
)[1];
link.download=文件名;
link.click();
window.URL.revokeObjectURL(link.href);
}捕获(错误){
console.log(error.response.data.message)
}
...
这是我的代码:
//后端
app.post('/foo',异步(req,res)=>{
试一试{
//抛出“出了问题”
res.download(path.resolve('bar.zip'))
}抓住{
res.status(400).json({message:'您有一个错误'})
}
})
//前端
;(异步函数(){
试一试{
//使用blob响应,无需包装响应数据即可再次创建blob
//{}是必需的,否则axios将{responseType}视为数据
let response=wait axios.post('/foo',{},{responseType:'blob'})
设blob=response.data
console.log(window.URL.createObjectURL(blob))
}捕获(错误){
console.log(error.response.data)
}
})()
到目前为止,这是有效的,除非后端抛出错误,否则axios将按照我们设置的blob处理响应。所以我们必须将其转换回json
axios.interceptors.response.use(null,异步错误=>{
if(error.response.request.responseType==='blob'){
//如果响应不是JSON,则可能需要添加错误处理程序
error.response.data=等待新承诺(解析=>{
let reader=new FileReader()
reader.addEventListener('load',()=>{
解析(JSON.parse(reader.result))
})
reader.readAsText(error.response.data)
})
}
抛出错误
});
这是与Github相关的。谢谢。现在我明白了,我的问题并非微不足道。它解决了我的问题。
//front end
try{
let response = await axios.post('/generateLoteXMLZIPConsulta');
let blob = await new Blob([response.data], {
type: "application/zip",
});
const link = document.createElement("a");
link.style.display = "none";
link.href = window.URL.createObjectURL(blob);
const fileName = response.headers["content-disposition"].match(
/filename=(.*)/
)[1];
link.download = fileName;
link.click();
window.URL.revokeObjectURL(link.href);
}catch(error){
console.log(error.response.data.message)
}
//backend nodejs
router.post("/generateLoteXMLZIPConsulta", async (req, res) => {
....
....
try
res.download(
path.resolve(__dirname, "../../file.zip"),
"xmlFile.zip"
);
catch (error){
res.removeHeader("Content-disposition");
res.status(400).json({ message: "You got an error" });
}
})