FeathersJS+Mongoose启动项目遇错误,求消除弃用及lean提示方法
嘿,我来帮你搞定这两个启动时的提示——一个是关于Mongoose lean选项的提醒,另一个是旧版populate方法弃用的通知,一步步来修复:
你遇到的错误提示
Mongoose option.lean is false. Use hook.results.toObject() to convert the results to JS objects
Calling populate(target, options) is now DEPRECATED and will be removed in the future
你的现有代码
var mongooseService = require('feathers-mongoose'); app.use('user', mongooseService({ name: 'user', Model: require('./../models/user'), id: 'cuid' })) .use('post', mongooseService({ name: 'post', Model: require('./../models/post'), })) var getLastPost = function() { return app.service('post').find({ query: { "status": { $in: [0, 1, 2] }, $select: ['version', '_id'] } }); }; app.service('post') .before(getLastPost) .after(hooks.populate('user', { service: 'user' }))
具体修复步骤
1. 解决lean选项的提示
这个提示是因为Feathers-Mongoose默认关闭了lean模式,返回的是Mongoose文档对象而非纯JavaScript对象。最直接的解决方式是在注册服务时开启lean: true,这样服务会直接返回纯JS对象,避免这个提示:
修改你的服务注册代码,给user和post服务添加lean配置:
app.use('user', mongooseService({ name: 'user', Model: require('./../models/user'), id: 'cuid', lean: true // 新增开启lean模式 })) .use('post', mongooseService({ name: 'post', Model: require('./../models/post'), lean: true // 新增开启lean模式 }))
要是你某些场景下必须保留Mongoose文档对象,也可以在hook里手动调用hook.result.toObject()来转换,但开启lean是更简洁的通用方案。
2. 替换弃用的hooks.populate方法
旧版的hooks.populate已经被标记为弃用,现在推荐使用feathers-hooks-common库提供的populate hook,这是Feathers生态里的标准做法:
第一步:安装依赖
先确保你安装了feathers-hooks-common:
npm install feathers-hooks-common
第二步:替换hook代码
修改你的hook部分,换成新的populate写法:
// 先引入feathers-hooks-common的populate方法 const { populate } = require('feathers-hooks-common'); // 替换原来的after hook配置 app.service('post') .before(getLastPost) .after(populate({ schema: { include: [{ service: 'user', // 关联的user服务 nameAs: 'user', // 结果中要显示的字段名,对应你原来的target parentField: 'user', // post文档中存储user关联ID的字段名(根据你的模型调整) childField: '_id' // user文档中的主键字段 }] } }));
如果你不想额外安装依赖,也可以在查询时直接用$populate参数来实现关联查询,比如修改你的getLastPost函数:
var getLastPost = function() { return app.service('post').find({ query: { "status": { $in: [0, 1, 2] }, $select: ['version', '_id'], $populate: 'user' // 直接在查询中指定要关联的字段 } }); };
不过这种方式只针对单个查询生效,要是需要全局的after hook处理,还是推荐第一种用feathers-hooks-common的方案。
验证修复
修改完成后重启项目,这两个警告提示应该就完全消失了。
内容的提问来源于stack exchange,提问作者AHmedRef

