【问题标题】:Deleted Loopback Model Property Still There删除的环回模型属性仍然存在
【发布时间】:2015-08-29 09:48:00
【问题描述】:

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

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

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

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 对象。

代码在操作钩子中,因此保存到数据库的内容不在此函数中。

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

delete 语句之后的调试器屏幕截图:

【问题讨论】:

  • 请您也发布一些代码吗?我们如何在不实际看到的情况下帮助调试某些东西? :)
  • @ELMOJO:我想每个人都想要一些代码 sn-ps。向我们展示delete 发生的函数中发生了什么。在您“将其传递回框架”之后,会发生什么?您是否尝试设置断点并单步执行该函数?
  • @ELMOJO:ctx.instance的原型是什么?
  • 在您刚刚发布的代码中,您有注释displays object properties including 'emailChanged' -- 它显示了什么?!
  • @ELMOJO:等一下? __data 是什么?删除前ctx.instance.hasOwnProperty('emailChanged') 吗?

标签: javascript node.js loopbackjs


【解决方案1】:

根据Loopback Operation Hooks

删除不需要的属性

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

ctx.instance.unsetAttribute('unwantedField');

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

应该这样做:

ctx.instance.unsetAttribute('emailChanged');

【讨论】:

  • 您能详细说明一下吗?这已经有一年多的历史了,我确信 Loopback 从那时起可能已经经历了几个小版本。你用的是什么版本?你想做什么?在 cmets 中打开一个新线程并将其链接到此处,也许我们可以弄清楚。
  • 好吧,已经有很多线程说明了这个问题。我使用环回 2.22,我尝试调试服务器并使用 ctx.instance.unsetAttribute('unwantedField');还尝试删除 ctx.data.unwantedfield;当我评估 ctx.data.unwantedfield 它仍然存在。我应该详细说明这仅适用于“bytea”数据类型 - 等效的强循环字段是二进制。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    如果是ctx.data

    delete ctx.data['propertyToBeRemoved'];
    

    如果是ctx.instance

    ctx.instance.unsetAttribute('propertyToBeRemoved')
    

    【讨论】:

      【解决方案4】:

      希望这可行

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

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

      【讨论】:

      • 阅读问题:“删除后的以下语句产生错误...'emailChanged' in data所以属性确实存在于对象(或其原型)。以上所做的就是创建一个值为undefined 的属性。但是,如果 OP 的代码的行为与描述的一样,那就没有必要或有用了。该问题目前无法回答,因为它目前描述了不会发生的事情。
      • @T.J.Crowder 你猜不出问题吗?它不是 JavaScript 对象。 gets save to the database, userId: 55e17a46e410f9603cea515b 这显然与数据库模型有关。 undefined 删除(取消设置)mongodb 中的属性(从 v2.4 开始)
      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      相关资源
      最近更新 更多