已删除的环回模型 属性 仍然存在
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
删除。
删除不需要的属性
要从上下文对象中删除不需要的属性(字段),请使用以下命令:
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')
我有一个名为 '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
删除。
删除不需要的属性
要从上下文对象中删除不需要的属性(字段),请使用以下命令:
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')