node.js - 处理Node.js中的错误

标签 node.js express error-handling

我正在制作一个nodejs Web API,并且我有一个函数可以返回与给定认证 token 关联的用户对象:

module.exports.getByToken = function (token_value, callback)
{
    mongoose.model('tokens').findOne({ value: token_value }).exec(function (err, token)
    {
        if (err || token == null)
        {
            var error = new Error('couldn\'t find user of the given token');
            callback(error, null);
        }
        else
        {
            mongoose.model('users').find({ _id: token.user }).exec(callback);
        }
    });
};

如您所见,我将错误传递回回调,而不是将其抛出。我做对了吗?

从身份验证中间件调用此函数:
app.use('/api', function (req, res, next)
{
    var token = req.headers.authorization;

    users.getByToken(token, function (err, user)
    {
        if (err || user == null)
        {
            res.status(401).end('Unauthorized');
        }
        else
        {
            app.locals.user = user;
            next();
        }
    });
});

因此,将错误传递回回调的想法很方便。
但这是处理错误的正确方法吗?

它可以阻塞主线程吗?
我应该抛出错误并在中间件中明确捕获它吗?

谢谢,
阿里克

最佳答案

IMO,您的做法正确。如果回调不负责处理错误,则应将错误作为第一个参数返回。如果您想改善如何处理任何可能的错误,可以将中间件更改为:

app.use('/api', function (req, res, next){
    var token = req.headers.authorization;

    users.getByToken(token, function (err, user){
        if (err){
            res.status(500).end('Something went wrong :('); //token could be valid but you have lost your connection to DB or any other error
        }else if (user == null){
            res.status(401).end('Unauthorized');
        }
        else {
            app.locals.user = user;
            next();
        }
    });
});

关于node.js - 处理Node.js中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493906/

相关文章:

javascript - 在 Angular 中关闭严格模式?

python - 直方图中绘图的百分比变化

error-handling - JMeter Beanshell使用try/catch进行错误处理

php - 菜鸟: display err_msg on page

javascript - 如何使用nodejs在服务器端将javascript动画转换为视频?

node.js - 调用 `getUser` 时发生 firebase-admin auth 错误,但调用 verifyToken 时工作正常

javascript - 如何有效地构建这个字符串?

node.js - 更新/刷新快速 session

javascript - Express.js 中间件可以依赖链中之前的中间件吗?

javascript - Node.js (VS Code) 中的环境变量未定义