Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用nodejs捕获下载文件的错误消息_Javascript_Node.js_Vue.js - Fatal编程技术网

Javascript 使用nodejs捕获下载文件的错误消息

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

我正在从nodejs下载一个文件

当后端出现错误时,我需要向前端发送消息

我的问题是我无法捕获该消息

我知道在后端使用blob和json存在一些问题

但我没有解决它

我的代码行:

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" });
            }
        })