You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FeathersJS+Mongoose启动项目遇错误,求消除弃用及lean提示方法

解决Feathers JS + Mongoose启动时的两个警告提示

嘿,我来帮你搞定这两个启动时的提示——一个是关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:14:04