Feathers.js获取自定义属性值:如何过滤Sequelize返回字段
Feathers.js + Sequelize 只返回指定字段的解决方案
下面给你几种实用的实现方式,按需选择:
方法1:在查询时直接指定返回字段
不管是service的get还是find方法,都可以通过Sequelize的attributes选项精准控制返回字段。比如在用户service的get方法里修改:
async get(id, params) { const user = await this.Model.findByPk(id, { attributes: ['name', 'email'] // 只取这两个字段 }); return user; }
如果是客户端发起请求,也可以通过查询参数指定:
// 客户端调用示例 app.service('users').get(用户ID, { query: { $select: ['name', 'email'] } });
方法2:用After Hook统一过滤返回结果
如果想让所有请求该service的接口都自动过滤字段,写个after钩子就行,一次性解决所有场景:
// 在users.service.js里添加钩子 module.exports = function(app) { const Users = app.service('users'); Users.hooks({ after: { all: [ (context) => { // 处理列表和单个对象两种情况 const formatResult = (item) => { const { name, email } = item; return { name, email }; }; if (Array.isArray(context.result)) { context.result = context.result.map(formatResult); } else { context.result = formatResult(context.result); } return context; } ] } }); };
方法3:给Sequelize模型设置默认查询范围
如果所有对用户模型的查询都默认只返回指定字段,直接在模型定义里加defaultScope:
// user.model.js module.exports = (sequelize, DataTypes) => { const User = sequelize.define('user', { name: DataTypes.STRING, email: DataTypes.STRING, createdAt: DataTypes.DATE, updatedAt: DataTypes.DATE }, { defaultScope: { attributes: ['name', 'email'] // 默认只查这俩字段 } }); return User; };
要是偶尔需要返回全部字段,查询时取消默认范围就行:
await User.scope(null).findByPk(id);
内容的提问来源于stack exchange,提问作者Nugraha
相关产品推荐
相关产品推荐

