Node.js,MongoDB异步回调问题

时间:2019-02-23 18:42:28

标签: node.js 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:undefined,信标:undefined。

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

此代码看起来非常简单,但我不知道出了什么问题。 请有人帮我。

1 个答案:

答案 0 :(得分:1)

通过使用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);
});