Feathers JS如何自定义get服务端点 为get返回结果添加自定义数据
问题场景
基于feathers-sequelize实现Users服务类,重写get方法后需要为用户请求结果附加关联服务对应URL等自定义数据,初始代码如下:
const { Service } = require('feathers-sequelize') exports.Users = class Users extends Service { get(id, params) { // how to add custom data into to the get result? return super.get(id, params) } }
实现方法
super.get(id, params)会返回Promise,resolved后是接口查询到的原始用户数据,只需要拿到原始数据后追加自定义字段,再将修改后的数据返回即可。
写法1:async/await(推荐,可读性更高)
const { Service } = require('feathers-sequelize') exports.Users = class Users extends Service { async get(id, params) { // 获取父类方法返回的原始用户数据 const user = await super.get(id, params) // 追加关联服务URL等自定义数据 user.links = { orders: `/users/${id}/orders`, posts: `/users/${id}/posts`, profile: `/users/${id}/profile` } // 可根据业务需求追加任意其他自定义字段 return user } }
写法2:Promise链式调用
const { Service } = require('feathers-sequelize') exports.Users = class Users extends Service { get(id, params) { return super.get(id, params).then(user => { // 追加自定义数据 user.links = { orders: `/users/${id}/orders`, posts: `/users/${id}/posts` } return user }) } }
特殊情况处理
如果sequelize配置返回的是模型实例而非普通JS对象,直接追加属性可能不会被序列化到最终响应中,此时需要先将实例转为普通对象再修改:
async get(id, params) { const userInstance = await super.get(id, params) // 转为普通JS对象 const user = userInstance.toJSON ? userInstance.toJSON() : { ...userInstance } // 追加自定义字段 user.links = { orders: `/users/${id}/orders` } return user }
内容的提问来源于stack exchange,提问作者Lelouch
相关产品推荐
相关产品推荐

