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

时间:2015-08-29 09:48:00

标签: javascript node.js loopbackjs

我有这个名为' ctx.instance'它具有以下属性:

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

此对象已传递到我的函数中。我需要剥离电子邮件变更'保存到数据库之前的属性。所以我这样做了:

delete ctx.instance.emailChanged;

删除返回' true'这意味着该物业不存在。

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

'emailChanged' in ctx.instance

然而,如果我做一个console.log(ctx.instance),那么' emailChanged'属性仍然存在,并将其保存到数据库中。

如果我检查属性的属性,它说它是可配置的。如果我在删除语句之后执行console.log(ctx.instance.emailChanged),则表示未定义'。

为什么还在那里?

我在互联网上搜索过,尝试了很多不同的东西,我无法找到原因。这是在Node环境中发生的。

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

数据变量是通过PUT从客户端提交给服务器的对象。数据对象最初是JSON,但Loopback使它成为JavaScript对象。

代码在操作挂钩中,因此对DB的保存不在此功能中。

'删除'在将函数传递给框架之前,语句是函数中的最后一个语句。

这是钩子的最小代码:

  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类型的环境,我会把它扔进去。

在delete语句后面的调试器监视器的屏幕截图: enter image description here

4 个答案:

答案 0 :(得分:6)

根据Loopback Operation Hooks

删除不需要的属性

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

ctx.instance.unsetAttribute('unwantedField');

这样就完全删除了字段,并防止将虚假数据插入数据库。

应该这样做:

ctx.instance.unsetAttribute('emailChanged');

答案 1 :(得分:0)

希望这有效

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

提问者想要删除模型的属性并将其保存到数据库中。但是无法使用delete删除模型的属性。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我可以使用follwing语句Loopback版本3删除不必要的属性保存到dataabse。

如果是ctx.data

delete ctx.data['propertyToBeRemoved'];

如果是ctx.instance

ctx.instance.unsetAttribute('propertyToBeRemoved')