【问题标题】:ExpressJS: Error: Can't set headers after they are sent.ExpressJS:错误:发送后无法设置标头。
【发布时间】:2014-07-19 01:59:17
【问题描述】:

我正在尝试向我的 ExpressJS 应用程序添加一个验证方法,但它似乎不太成功...我目前可以更改用户名,但是如果它有一个空字符串,应用程序会崩溃,尽管它是假设发送一个错误。有什么建议吗?

var validatePresenceOf = function(val, func) {
    if (typeof val === 'undefined' || val.length < 1) {
        res.json({
            errors: {
                userName: "Your name can't be blank"
            }
        });
    } else {
        return func;
    }
};

validatePresenceOf(req.body.userName, User.findByIdAndUpdate( currentUser._id, {
    local: {
        name                : req.body.userName
    }
}, function (err, user) {

    if (err) throw err;

    res.json({
        user : user
    });
}));

【问题讨论】:

  • 您的错误应该有一个堆栈跟踪,其中包含对您的代码的引用。跟踪该行号并将其编辑到您的问题中。此外,this question 非常彻底地涵盖了标题问题,如果您还没有看到的话。

标签: javascript node.js express


【解决方案1】:

当两次调用 setHeader 方法时,Express 给出错误。当验证方法给出错误时,您可能忘记或没有使用“return”!请检查这个。我相信express validator 对你来说是更好的解决方案

【讨论】:

    【解决方案2】:

    您不应在验证检查前立即致电User.findByIdAndUpdate()

    这个可以暂时解决你的问题:

    var validatePresenceOf = function(val, func) {
        if (typeof val === 'undefined' || val.length < 1) {
            res.json({
                errors: {
                    userName: "Your name can't be blank"
                }
            });
        } else {
            func();
        }
    };
    
    validatePresenceOf(req.body.userName, function() {
        User.findByIdAndUpdate( currentUser._id, {
            local: {
                name: req.body.userName
            }
        }, function (err, user) {
    
            if (err) throw err;
    
            res.json({
                user : user
            });
        });
    });
    

    但是,我建议使用 express-validator 作为请求验证的最佳实践。

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2018-06-08
      • 2018-06-29
      • 2013-12-22
      相关资源
      最近更新 更多