MongooseJS对象在回调函数内部未定义

时间:2018-04-02 00:38:24

标签: javascript mongodb rest express mongoose

我正在尝试为API返回一个端点,该API将返回给定用户的所有订单。我的问题是,当我尝试使用mongoose的findById函数查询数据库时,'user'对象在回调函数中是未定义的,我无法查询订单subdoc。为了增加混乱,如果我不使用回调函数,我可以让它工作,但是我没有正确的错误处理。

var mongoose = require('mongoose');
var router = express.Router();

var order_model = require('../models/order');
var user_model = require('../models/user');

router.get('/:userid/order/', function (req, res) {

    // This works???
    var u = user_model.findById(req.params.userid);
    res.json(u.orders);

});

以下代码抛出错误“TypeError:无法读取未定义的属性'命令'。

var mongoose = require('mongoose');
var router = express.Router();

var order_model = require('../models/order');
var user_model = require('../models/user');
router.get('/:userid/order/', function (req, res) {

    // This throws an error.
    user_model.findById(req.params.userid).then(function (err, user) {
        if (err) {
            res.send(err);
        }
        res.json(user.orders);
    });
});

user.js的

var mongoose = require('mongoose');
var ordersSchema = require('./order').schema;

var userSchema = new mongoose.Schema({
    name: String,
    email: String,
    showroom: String,
    orders: [ordersSchema]
});

module.exports = mongoose.model('User', userSchema);

order.js

var mongoose = require('mongoose');
var lineItemsSchema = require('./lineitem').schema;

var ordersSchema = new mongoose.Schema({
    trackingNumber: Number,
    lineItems: [lineItemsSchema]
});

module.exports = mongoose.model('Order', ordersSchema);

对此行为的任何帮助/解释将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

then回调的第一个参数是user,而不是err

使用传统的回调:

user_model.findById(req.params.userid, function (err, user) {
    if (err) {
        res.send(err);
        return; // Need to return here to not continue with non-error case
    }
    res.json(user.orders);
});

或者对承诺单独处理错误的catch链接:

user_model.findById(req.params.userid).then(function (user) {
    res.json(user.orders);
}).catch(function(err) {
    res.send(err);
});

答案 1 :(得分:0)

我通常会这样查询,它完美无缺:

user_model.find(_id : req.params.userid)
    .exec((err, user) => {
       if(err){
          //handle error
       }
       return res.status(200).json(user.orders);
    })
});