我在我的快递中制定了一条路线,在提交时处理表单。
当表单流程遇到错误或问题时,我正在尝试设置状态并向客户端发送响应。
我在前端使用 FormData() 并在后端使用 formidable 。
这是我尝试处理方法回调中的错误的方法:
if (err) {
res.status(500) // i have tried different status-codes !
.send(`error on parsing : ${err}`)
.end();
}
问题是:
1_ 如果我设置了大部分状态代码(除了 200 之外的几乎所有状态代码),那么我会收到一条响应,表示请求失败,状态代码为 500(或我设置的其他代码),并且 .send() 方法发送的数据未收到客户端
2_ .send() 带或不带 .end() 不会停止要执行的其余代码,因为我试图在遇到错误时结束回调中的响应,否则最后会发送 200 状态代码,代码执行直到结束并到达末尾,它尝试再次设置状态,当它们发送到客户端时,我收到错误无法设置标头
我尝试过用不同的方法设置状态代码或以其他方式发送响应。
我搜索了网络,发现正确的方法是 res.status().send() 并且我做得正确,但是我遇到了问题。
这是我的代码(如果您需要,我可以粘贴完整代码):
app.post("/upload", (req, res) => {
var form = new formidable.IncomingForm();
form.on("error", err => {
if (err) {
res
.status(500)
.send(`Error on formidable : ${err}`)
.end();
console.log('continued');
}
});
form.encoding = "utf8";
form.uploadDir = "./uploadedFiles/";
form.maxFileSize = 2000 * 1024 * 1024;
form.parse(req, (err, fields, files) => {
if (err) {
res.status(500)
.send(`error on parsing : ${err}`)
.end();
}
// code continues with same style , methods with error handling in call backs
//at the end of code :
res.status(200).send("form successfully Submitted !");
}
客户端代码的“获取响应”部分:
try {
let response = await axios.post("/upload", FD, {
"Content-Type": "multipart/form-data"
});
console.log(response);
$("#res")
.css("display", "block")
.text(response.data);
$("#spinnerbox").css("display", "none");
} catch (error) {
$("#res")
.css("display", "block")
.text(error);
console.log("Catched Error");
}
我希望当我设置状态时我也能够发送响应。 (正如我搜索的 res.status().send() 应该是正确的)。
我很感激你的帮助。
你最好的解决方案是使用 try 和 catch 块,然后抛出新的错误 并创建错误中间件,然后您可以设置状态代码并使用错误调用下一步
app.get('/route', (req, res, next) => {
try {
// do something
if ('something failed') {
throw new Error('error message!');
}
} catch (err) {
next(err);
}
});
// or if you want to set the status code
app.get('/route', (req, res, next) => {
try {
// do something
if ('something failed') {
res.status(500);
const error = new Error('error message!');
next(error);
}
} catch (err) {
next(err);
}
});
您也可以使用
.josn
返回回复。
200
return res.status(200).json({ msg: 'SUCCESS' });
400
return res.status(400).json({ error: 'ERROR' });
在您的实例中出现错误 错误:发送到客户端后无法设置标头
当您的服务器返回单个请求的多个响应时,就会出现这种情况 例如。
// Incorrect Example
if(something) {
res.status(200).json({ msg: 'SUCCESS' });
}
res.status(400).json({ error: 'ERROR' });
在上面的代码中,一旦条件满足,它就会给出
200
,在其他情况下它会给出400
,Si这里2次响应发送,发生这样的错误(错误:无法在它们之后设置标题)发送给客户)
为了避免此类错误,您需要在响应之前添加关键字
return
。
// Correct Example
if(something) {
return res.status(200).json({ msg: 'SUCCESS' });
}
return res.status(400).json({ error: 'ERROR' });
尝试修改你的 if 语句:
if (err) {
res.setHeader('Cache-Control', 'no-store');
res.status(500) // i have tried different status-codes !
.send(`error on parsing : ${err}`)
.end();
}
客户端的缓存版本是最新的,不会从服务器重新下载。因为您的浏览器没有请求新的浏览器,所以状态代码不会被修改。