Node.js错误:发送后无法设置标头

时间:2016-12-20 14:27:54

标签: javascript node.js mongodb mongoose

我知道这个问题已经存在,但我找到的解决方案并不适用于我。我正在Node.js中构建一个基本的创建函数。它首先检查对象是否已经存在,如果不存在,则创建一个。即使我将else ifreturn添加到每个条件后,我也会收到此错误。但似乎无论如何都会被执行。这是我的代码:

controllers/shop.js:

var Shop = require('../models/shop').model;
module.exports = {
    create: function(req, res) {
        if(typeof(req) != 'object')
            return res.status(400).send({error: Error.InvalidInput});
        if(req.body.name === null) return res.status(400).json({error: Error.missingParameter('name')});
        Shop.findOne({name: req.body.name}, function(err, shop){
            if(err) return res.status(500).json({error: Error.unknownError});
            else if (shop) return res.status(409).json({error: Error.alreadyExists('Shop')});
        }).exec(Shop.create({name: req.body.name}, function(err, shop) {
            if (err) return res.status(500).json({error: Error.unknownError});
            else if (shop) return res.status(201).json(shop);
            else if (!shop) return res.status(400).json({error: Error.createFailed('Shop')});
        }));
    },
}

2 个答案:

答案 0 :(得分:1)

您应该在callback方法中传递find或使用exec的函数,但不应同时使用它们,因为它们都是异步的并且同时被调用。

您可以按照以下方式重构代码。

var Shop = require('../models/shop').model;
module.exports = {
    create: function(req, res) {
        if(typeof(req) != 'object')
            return res.status(400).send({error: Error.InvalidInput});
        if(req.body.name === null) return res.status(400).json({error: Error.missingParameter('name')});
        Shop.findOne({name: req.body.name}, function(err, shop){
            if(err) return res.status(500).json({error: Error.unknownError});
            else if (shop) return res.status(409).json({error: Error.alreadyExists('Shop')});
            else {
                Shop.create({name: req.body.name}, function(err, shop) {
                if (err) return res.status(500).json({error: Error.unknownError});
                else if (shop) return res.status(201).json(shop);
                else if (!shop) return res.status(400).json({error: Error.createFailed('Shop')});
        });
            }
        });
    },
}

答案 1 :(得分:0)

尝试在if语句中为响应状态和错误/其他消息设置变量。然后在create function的末尾返回一个填充了变量

的响应对象
var Shop = require('../models/shop').model;
module.exports = {
    create: function(req, res) {
        var status = 200;
        var message = "";
        if(typeof(req) != 'object')
            status = 400;
            message = Error.InvalidInput;
           ...
        return res.status(status).send({error: message});
          });
        }));
    },
}