首页 > 解决方案 > 从不在类中的对象中删除属性

问题描述

我正在使用 adonisjs,并试图清理服务器上的发布请求。我返回的数据具有未映射到表/模型的额外属性,因此当我尝试保存时出错。这是更新方法

async update ({ params, request, response }) {
  const contract = await Contract.find(params.id);
  contract.merge(request.post());
  return await contract.save();
}

问题是,当我早些时候在 get 请求中返回合同时,我添加了一些计算属性。我可以做一些类似的事情

const { prop1, prop2 } = request.post();

但这感觉不像是未来的证明或干净的解决方案。理想情况下,我希望对象仅具有在表/模型上定义的属性。我有一个验证器设置,如验证器文档中所述,但它仍然允许其他属性绕过它。

标签: javascriptnode.jsadonis.js

解决方案


我通过在模型类中添加一个 beforeSave 钩子来解决这个问题,该钩子过滤对象上的属性,这允许我们保留一个瘦控制器。

const FIELDS = ['id', 'description'];

class Contract extends Model {
  static boot() {
    super.boot();
    this.addHook('beforeSave', async contractInstance => {
      Object.keys(contractInstance.$attributes).forEach(key => {
        if (!CONTRACT_FIELDS.includes(key)) {
          delete contractInstance.$attribute[key];
        }
      });
    });
  }
}

推荐阅读