无法向 Mongoose 查询返回的对象添加新属性

Can't add a new property to an object returned by Mongoose query

本文关键字:新属性 添加 属性 对象 Mongoose 查询 返回      更新时间:2023-09-26

我正在使用Node.js,MongoDB和Express编写API。我似乎无法向我正在迭代的位置对象添加新属性。

我根本不明白我的代码的问题。 loc是一个普通对象,它应该可以工作。我错了吗?

// **********************************
// GET Locations
// **********************************
// Create endpoint /api/locations for GET
exports.getLocations = function(req, res) {
    // Use the Location model to find all locations
    // of a particular user
    Location.find({}, function(err, locations) {
        if (err)
            res.send(err);
        var counter = 0;
        var l = locations.length;
        //we create a closure to access the current location object
        var closure = function(location) {
             //we are returning the callback
             return function(err, user) {
                if (err)
                    res.send(err);
                counter++;
                console.log("The location object: 'n"+location+"'n'n");
                console.log("The value we want to add to the object: 'n"+user.username+"'n'n");
                //THAT DOESN'T WORK
                location.username = user.username;
                console.log("The updated object: 'n"+location+"'n'n");
                if(counter === l) res.json(locations);
            };
        };
        //We respond with the locations
        for (var i = 0; i < l; i++) {
            //we call our function
            User.findById(locations[i].userId, "username", closure(locations[i]));
        }
    });
};

这是我在控制台中获得的输出...这太奇怪了。

The location object:
{ _id: 54c65c665ff13962b6a367a1,
  userId: '54c659ba8ac00324b617f3f9',
  message: 'Big party here tonight!!',
  longitude: 45.5,
  latitude: 73.5667,
  __v: 0 }

The value we want to add to the object:
test123

The updated object:
{ _id: 54c65c665ff13962b6a367a1,
  userId: '54c659ba8ac00324b617f3f9',
  message: 'Big party here tonight!!',
  longitude: 45.5,
  latitude: 73.5667,
  __v: 0 }

在我们的例子中,你MongooseDocument没有plain JS对象。为了获得plain JS对象,您应该使用这样的.lean

Location.find({}).lean().exec(function(err, locations) {
    ...
});