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