如果找不到文档,则停止响应

时间:2016-07-24 15:15:48

标签: node.js express

我的脚本检查数据库中是否存在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。

1 个答案:

答案 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除了在从未发送过响应时停止处理,否则不会做任何有用的事情。