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

EL *_*OJO 4 javascript node.js loopbackjs

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

firstName: 'Ron',
lastName: 'Santo',
minor: true,
accepted: false,
emailChanged: false,
organizationId: 000000000000000001000001,
isDeleted: false,
userId: 55e17a46e410f9603cea515b
Run Code Online (Sandbox Code Playgroud)

这个对象被传递到我的函数中.在将其保存到数据库之前,我需要剥离'emailChanged'属性.所以我这样做了:

delete ctx.instance.emailChanged;
Run Code Online (Sandbox Code Playgroud)

delete返回'true',表示该属性不存在.

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

'emailChanged' in ctx.instance
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行console.log(ctx.instance),'emailChanged'属性仍然存在,并将其保存到数据库中.

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

它为什么还在那里?

我在互联网上搜索过,尝试了很多不同的东西,我找不到为什么会这样.这发生在Node环境中.

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

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

代码在操作挂钩中,因此对DB的保存不在此函数中.

在我将函数传递回框架之前,'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();
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果你们中的任何人都知道包含Loopback的JSFiddle类型的环境,我会把它扔进去.

删除语句后面的调试器监视器的屏幕截图: 在此输入图像描述

EL *_*OJO 6

根据Loopback Operation Hooks

删除不需要的属性

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

ctx.instance.unsetAttribute('unwantedField');
Run Code Online (Sandbox Code Playgroud)

这样可以完全删除该字段并防止将虚假数据插入数据库.

应该这样做:

ctx.instance.unsetAttribute('emailChanged');
Run Code Online (Sandbox Code Playgroud)