使用 throw 处理用户错误有多正确?下面是工作代码,但我不确定它在风格上是否正确。如果在数据库中找不到用户,则会生成带有文本和错误代码的 throw,该代码在函数本身的 catch 级别被拦截,从中再次调用 throw,然后记录并从app.js 的函数。
async function login(req, res) {
try {
const db = req.app.db;
params = { email: req.body.email, isDeleted: false }
doc = await db.users.findOne(params);
if (!doc) {
const msg = `User ${req.body.email} not found.`;
throw new Error(msg, 404);
}
const resultComparePassword = await bcrypt.compare(req.body.password, doc.password);
if (!resultComparePassword) {
const msg = 'Invalid password';
throw new Error(msg, 401);
};
const token = jwt.sign(
{
id: doc._id,
email: doc.email,
role: doc.role
},
process.env.JWT_KEY,
{
expiresIn: "1h"
}
);
const msg = {
token: token
};
return res.status(200).json(msg);
} catch (ex) {
throw new Error(ex);
}
};
app.js 代码
app.use((req, res, next) => {
const error = new Error('Not Found');
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
console.error(err.stack);
next(err);
});
app.use((error, req, res, next) => {
res.status(error.status || 500);
res.json({
error: {
code: error.code,
message: error.message
}
})
});
当然,指令产生的异常
throw是正确无误的。使用这种方法!但是关于您的代码有几点需要注意。
以您的方式抛出异常是不正确的
throw new Error(msg, 404)。第二个参数根本不像预期的参数fileName。在这里,您需要一个
Error知道错误代码的类继任者:在回答什么是扩展 JavaScript 中的错误的好方法?您将能够选择最适合您的方式来声明您的错误类。
另外,给 npm 带一个现成的模块也是一个不错的主意,例如http-errors,它已经具备了 http 异常的功能。
对代码还有一点说明:将代码包装起来
try..catch只是为了catch抛出上面的错误是没有意义的——它会自行发生。