已删除的环回模型 属性 仍然存在

Deleted Loopback Model Property Still There

我有一个名为 'ctx.instance' 的对象,它具有以下属性:

firstName: 'Ron',
lastName: 'Santo',
minor: true,
accepted: false,
emailChanged: false,
organizationId: 000000000000000001000001,
isDeleted: false,
userId: 55e17a46e410f9603cea515b

此对象已传递到我的函数中。在将其保存到数据库之前,我需要删除 'emailChanged' 属性 。所以我这样做了:

delete ctx.instance.emailChanged;

删除returns'true'表示属性不存在

删除后的以下语句产生 false,这也意味着它应该消失:

'emailChanged' in ctx.instance

然而,如果我执行 console.log(ctx.instance),'emailChanged' 属性 仍然存在并且它被保存到数据库中。

如果我检查 属性 的属性,它说它是可配置的。如果我在删除语句后执行 console.log(ctx.instance.emailChanged),它会显示 'undefined'.

为什么它还在那里?

我在整个互联网上搜索过,尝试过很多不同的方法,但我找不到为什么会这样。这是在 Node 环境中发生的。

更新: 数据库是 Mongo。我正在使用 Loopback.js 模型和框架。

data变量是客户端通过PUT提交给服务器的对象。数据对象最初是 JSON 但 Loopback 已将其变为 JavaScript 对象。

代码在操作挂钩中,因此保存到数据库不在该函数中。

'delete' 语句是函数中的最后一条语句,然后我将它传递回框架。

这里是钩子的最小代码:

  module.exports = function( Member )
  {
    Member.observe( 'before save', upsertMember );

    function upsertMember( ctx, next )
    {
      // displays 'true' 
      console.log( ctx.instance.hasOwnProperty( 'emailChanged' ) );

      // displays 'false'
      console.log( ctx.instance.emailChanged );
      var isDeleted = delete ctx.instance.emailChanged;

      // displays 'true'
      console.log( isDeleted );

      // displays 'false'
      console.log( 'emailChanged' in ctx.instance );

      // displays 'false' 
      console.log( ctx.instance.hasOwnProperty( 'emailChanged' ) );

      // displays 'undefined'
      console.log( ctx.instance.emailChanged );
      // displays object properties including 'emailChanged'
      console.log( ctx.instance );
      // pass control back to loopback for upsert
      // 'emailChanged' gets into MongoDB record
      next();
    }
  }

如果你们中有人知道包含 Loopback 的 JSFiddle 类型的环境,我会把它放在那里。

删除语句后我的调试器屏幕截图:

希望这有效

data.emailChanged = undefined;
data.save(callback);

提问者想删除一个模型的属性,存入数据库。但是模型的属性不能用delete删除。

根据Loopback Operation Hooks

删除不需要的属性

要从上下文对象中删除不需要的属性(字段),请使用以下命令:

ctx.instance.unsetAttribute('unwantedField');

这会完全删除该字段并防止将虚假数据插入数据库。

应该这样做:

ctx.instance.unsetAttribute('emailChanged');

可能是因为 PUT 动词用于替换整个实例而不仅仅是某些属性?(要仅更改某些属性,您应该使用 PATCH 动词)。

所以它可能是环回填充模型中缺少的属性并为 "emailChanged" 属性提供默认布尔值 (false)。

我能够使用以下语句环回版本 3 将不必要的 属性 从保存到数据库中删除。

如果ctx.data

delete ctx.data['propertyToBeRemoved'];

如果ctx.instance

ctx.instance.unsetAttribute('propertyToBeRemoved')