首页 > 解决方案 > Nodejs、MongoDB异步回调问题

问题描述

我是nodejs和MongoDB的初学者。我尝试设计RESTAPI但出现了问题。

这是我的路由器代码。

app.post('/fcm',function(req,res){

    var beaconid = req.body.beacon_id;
    var my_token_id = req.body.user_id;

    User.find({beacon_id: beaconid}, function(err, output){
        if(err) return res.status(500).json({error: err});
        if(!output) return res.status(404).json({error: 'user not found in User collections.'});

        console.log("output user id :"+output.user_id + " beacon: " +output.beacon_id );
        target_token_id = output.user_id;
        res.json(output);
    });                
});

这是用户模式。

var userSchema = new Schema({
user_id: String,
beacon_id: String

});

上述函数在控制台的结果是:输出用户id:未定义,信标:未定义。

但是 res 函数中的 json 打印正确。

这段代码看起来很简单,但我不知道是什么问题。请有人帮助我。

标签: node.jsmongodb

解决方案


通过使用find,您期望 1 个文档或更多。这意味着该方法<Model>.find()应该在逻辑上返回一个数组。您可以通过output在查询之后记录 以确保它是文档数组来确保发生这种情况。

要解决您的问题,您可以访问数组索引 0 处的文档:

User.find({beacon_id: beaconid}, function(err, output){
    if(err) return res.status(500).json({error: err});
    if(!output) return res.status(404).json({error: 'user not found in User collections.'});

    console.log("output user id :"+output[0].user_id + " beacon: " +output[0].beacon_id );
    target_token_id = output[0].user_id;
    res.json(output);
}); 

或者改用findOne()它,它只返回一个文档。

User.findOne({beacon_id: beaconid}, function(err, output){
    if(err) return res.status(500).json({error: err});
    if(!output) return res.status(404).json({error: 'user not found in User collections.'});

    console.log("output user id :"+output.user_id + " beacon: " +output.beacon_id );
    target_token_id = output.user_id;
    res.json(output);
});

推荐阅读