在文档上调用lean会引发TypeError:lean不是函数

时间:2018-10-23 13:19:38

标签: node.js mongodb mongoose

我是猫鼬的新手,我正在尝试创建一个使用OpenWeatherMap API的应用程序。从API请求数据后,我将它们保存到MongoDB中,然后想将结果作为json返回,因此我调用了以下函数:

async function saveForecast(data) {

// Code here for creating the "forecastList" from the data and fetching the "savedLocation" from the DB

const newForecast = new Forecast({
    _id: new mongoose.Types.ObjectId(),
    location: savedLocation,
    city: {
        id: data.city.id,
        name: data.city.name,
        coordinates: data.city.coord,
        country: data.city.country
    },
    forecasts: forecastList
});

try {
    const savedForecast = await newForecast.save();
    return savedForecast.populate('location').lean().exec(); //FIXME: The lean() here throws  TypeError: savedForecast.populate(...).lean is not a function
} catch (err) {
    console.log('Error while saving forecast. ' + err);
}
}

“ newForecast”已成功保存在数据库中,但是当我在填充后尝试添加.lean()时,出现以下错误: TypeError: savedForecast.populate(...).lean is not a function

我已经在查找查询上使用了lean(),并且效果很好,但是我无法使它与我的“ newForecast”对象一起使用,即使“ savedForecast”是猫鼬文档,如调试器所示。

任何想法为何lean()无法正常工作?谢谢!

1 个答案:

答案 0 :(得分:1)

问题来自Document没有lean()方法的事实。

await newForecast.save();不会返回Query,而是返回Document。然后在populate上运行Document也会返回Document。要将Document转换为普通的JS对象,您必须使用Document.prototype.toObject()方法:

try {
    const savedForecast = await newForecast.save();
    return savedForecast.populate('location').toObject(); // Wrong! `location` is not populated!
} catch (err) {
    console.log('Error while saving forecast. ' + err);
}

但是,此代码将错误执行-不会调用总体,因为populate必须接收回调参数,或者必须在其上调用execPopulate(返回Promise)。就您正在使用async/await而言,我建议您使用execPopulate而不是回调。最后但并非最不重要的一点是-填充的location需要倾斜:

try {
    const savedForecast = await newForecast.save();
    return await savedForecast
      .populate({ path: 'location', options: { lean: true }})
      .execPopulate()
      .then(populatedForecast => populatedForecast.toObject());
} catch (err) {
    console.log('Error while saving forecast. ' + err);
}