回调内部回调在节点Express

时间:2016-11-18 15:56:40

标签: node.js express

我正在使用node Express作为我的后端应用程序。 我写了一个方法,从快速请求对象获取一些输入。该方法通过res.write(...)进行一些检查并将消息写入响应对象。在所有检查结束时,我调用res.end();到现在为止还挺好。 我的一些检查需要mongodb访问,因此我必须使用回调。这是一些代码:

app.post("/addUser", function (req, res) {
expdb.unique({ "email": req.body.email }, function (isUnique) {
    if (!isUnique) {
        res.write("email error");
    }
})
expdb.unique({ "_id": req.body.user }, function (isUnique) {
    if (!isUnique) {
        res.write("user error");
    }
})
/* -- below here everything works fine -- */
if (req.body.user.length < 3 || req.body.user.length > 20) {
    res.write("username to short ...or to long");
}
/* -- ... more working code -- */
res.end();
});

前两个响应完全被忽略。 我很确定这里会发生一些时髦的回调魔法,但我无法弄清楚如何做到这一点。 我尝试了类似下面的内容,以确保回调知道响应对象,但它也失败了:

expdb.unique({"_id": req.body.user}, function(result, respond) {
    if(!result) {
        respond.write("user error")
    }
}, res)

可能有人帮我这个。

感谢 -Dirk

2 个答案:

答案 0 :(得分:1)

如评论中所述,以下内容应该有效

var theEnd = function(response){
   if (req.body.user.length < 3 || req.body.user.length > 20) {
     res.write("username to short ...or to long");
   }
   /* -- ... more working code -- */
   res.end();
};

app.post("/addUser", function (req, res) {
  expdb.unique({ "email": req.body.email }, function (isUnique) {
    if (!isUnique) {
        res.write("email error");
    }
    theEnd(res);
  })
  expdb.unique({ "_id": req.body.user }, function (isUnique) {
    if (!isUnique) {
        res.write("user error");
    }
    theEnd(res);
  })

答案 1 :(得分:0)

感谢卡尔曼,我终于做对了。以下是寻找它的人的工作代码:

app.post("/addUser", function (req, res) {
    expdb.unique({ "email": req.body.email }, function (uniqueEmail) {
        if (!uniqueEmail) {
            res.write("Email in use\n");
        }
        expdb.unique({ "_id": req.body.user }, function (uniqueUser) {
            if (!uniqueUser) {
                res.write("Username in use\n");
            }
            if (req.body.user.length < 3 || req.body.user.length > 20) {
                res.write("username to short ...or to long\n");
            }
            /* -- other validations --*/
            res.end();
        });
    });
});