我有一个名为a
的函数,它接受一个回调函数,如果有错误则调用该函数。
a
。如果出现错误,则错误应该是请求的响应。
function a(cb) {
cb(new Error('Some error message'))
}
app.get('/', function (req, res) {
a(function (error) {
if (error) {
res.json(error, 400)
}
res.send('No error')
})
})
我查看了Express的代码,res.json
似乎会将error
字符串化。但是,结果是空字符串:
> var e = new Error('Some error message')
undefined
> JSON.stringify(e)
'{}'
> e.message
'Some error message'
有些方法可以让我的路由返回错误消息,例如在路由中转换错误对象toString
。但是,我想知道在Node API中格式化错误消息的最佳做法是什么,以及这是否会改变这里的内容。我应该以不同方式格式化错误消息,还是应该只处理路由中的Error
对象,例如:
res.json({ error: error.message }, 400)
答案 0 :(得分:5)
要添加到@ steveukx的答案,您可以通过.use
一个arity为4的函数在express中指定错误处理程序。
app.use(function(err, req, res, next){
res.json(500, {
error: err.message
});
});
每当您执行next(err)
时都会调用。
请参阅the docs。
答案 1 :(得分:1)
我现在不知道您的响应是什么样的,当没有错误发生时,但这就是我通常处理JSON响应的方式:
function (err, data) {
if (err) {
res.json({
success: false,
error: err.message
}, 400);
}
else {
res.json({
success: true,
data: data
});
}
}
尝试将其包装在额外的中间件/功能中。保持函数的签名类似于标准节点样式。 (第一个参数错误,跟随参数实际数据。)这样,客户端可以很容易地处理您的响应,因为您只需要查看success
字段。
答案 2 :(得分:1)
Express路由可以使用第三个参数next
,可以通过调用next()
来跳过当前路由,或者通过调用next(err)
来传递错误
尝试使用:
app.get('/', function (req, res, next) {
a(function (error) {
if (error) {
next(error);
}
else {
res.send('No error')
}
});
});
有关详细信息,请查看http://expressjs.com/api.html#app.param
答案 3 :(得分:0)
引发错误的正确方法是使用信息错误而不是一般错误。仅当信息错误本身由于某种原因而失败时,才应引发通用错误。这是我用来演示自定义错误并回退到通用错误的通用处理程序:
fpToExpressJson = async (response, next, fp, args) => {
const oResponse = await fp(args).catch(err => err);
if (!oResponse) {
return next(createError(404));
}
if (oResponse.errorCode) {
// Good job developer! You threw a descriptive error.
try {
return response.status(oResponse.errorCode).send(oResponse);
} catch (error) {
return next(error);
}
}
return response.json(oResponse);
};