我有这个名为' 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类型的环境,我会把它扔进去。
答案 0 :(得分:6)
删除不需要的属性
要从上下文对象中删除不需要的属性(字段),请使用以下命令:
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')