我是猫鼬的新手,我正在尝试创建一个使用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()无法正常工作?谢谢!
答案 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);
}