我的脚本检查数据库中是否存在id。如果它没有,它应该在那里停止逻辑。
但目前发生的事情不是返回"我们的数据库中没有提供的项目ID。",它返回"请发送所有必需的详细信息。"。 (可能是因为第一次回归将我们带出了这个功能)
var projectExists = function(pId, callback) {
ProjectsData.count( {project_id: pId}, function(err, doc) {
if (err) {
throw err;
}
callback(doc);
});
};
// Create a new Game ID.
v1.post("/", function(req, res, next) {
if ( !("project_id" in req.body) ) {
return res.send("You need to provide Project ID");
}
// Check if the Project ID is in the file.
// Problematic bit
projectExists( req.body.project_id, function(c) {
if ( c == 0 ) {
return res.send("The provided Project Id does not exist in our database.");
}
});
var gameDataObj = req.body;
GameData.addGameId(gameDataObj, function (err, doc) {
if (err) {
if (err.name == "ValidationError") {
return res.send("Please send all the required details.");
}
throw err;
};
res.json(doc);
})
});
我做错了什么?有没有更好的方法呢?
跟进问题;在当前迭代中,如果id错误,也会出现此错误:
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header (G:\node\vnlytics\node_modules\express\lib\response.js:719:10)
at ServerResponse.send (G:\node\vnlytics\node_modules\express\lib\response.js:164:12)
at G:\node\vnlytics\controllers\v1\game.data.js:35:17
at G:\node\vnlytics\controllers\v1\game.data.js:20:9
at Query.<anonymous> (G:\node\vnlytics\node_modules\mongoose\lib\model.js:3331:16)
at G:\node\vnlytics\node_modules\kareem\index.js:259:21
at G:\node\vnlytics\node_modules\kareem\index.js:127:16
at nextTickCallbackWith0Args (node.js:420:9)
at process._tickCallback (node.js:349:13)
这可能是因为我们发送了两个回复,但奇怪的是检查res.headersSent直到最后一刻返回false。
答案 0 :(得分:1)
正如我在评论中所说的那样,您需要正确排序异步操作,这样您才能启动下一个操作,直到您知道上一个操作的结果并处理完毕。你可以这样做:
// Create a new Game ID.
v1.post("/", function(req, res, next) {
if ( !("project_id" in req.body) ) {
return res.send("You need to provide Project ID");
}
// Check if the Project ID is in the file.
// Problematic bit
projectExists( req.body.project_id, function(c) {
if ( c == 0 ) {
return res.send("The provided Project Id does not exist in our database.");
} else {
var gameDataObj = req.body;
GameData.addGameId(gameDataObj, function (err, doc) {
if (err) {
if (err.name == "ValidationError") {
return res.send("Please send all the required details.");
}
throw err;
};
res.json(doc);
})
}
});
});
P.S。您应该使用正确的错误处理替换throw err
。您需要在此处实际发送错误响应。 throw
除了在从未发送过响应时停止处理,否则不会做任何有用的事情。