【发布时间】: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 类型的环境,我会把它扔进去。
【问题讨论】:
-
请您也发布一些代码吗?我们如何在不实际看到的情况下帮助调试某些东西? :)
-
@ELMOJO:我想每个人都想要一些代码 sn-ps。向我们展示
delete发生的函数中发生了什么。在您“将其传递回框架”之后,会发生什么?您是否尝试设置断点并单步执行该函数? -
@ELMOJO:
ctx.instance的原型是什么? -
在您刚刚发布的代码中,您有注释
displays object properties including 'emailChanged'-- 它显示了什么值?! -
@ELMOJO:等一下?
__data是什么?删除前ctx.instance.hasOwnProperty('emailChanged')吗?
标签: javascript node.js loopbackjs