在向用户呈现数据之前删除JSON内容/删除JavaScript对象属性
我有一个问题,我不太清楚为什么我不能解决我的问题 我有一个SPA,它是使用AngularJS、Node.JS和MongoDB(Mongoose)构建的。现在在客户端上,我有一个表单来注册一个新用户。表单有一个文本输入,该输入具有与其在向用户呈现数据之前删除JSON内容/删除JavaScript对象属性,javascript,mongodb,angularjs,Javascript,Mongodb,Angularjs,我有一个问题,我不太清楚为什么我不能解决我的问题 我有一个SPA,它是使用AngularJS、Node.JS和MongoDB(Mongoose)构建的。现在在客户端上,我有一个表单来注册一个新用户。表单有一个文本输入,该输入具有与其onblur事件相关联的函数(确切地说是ng blur)。函数向后端发送一个Ajax/$http调用,以在提交表单之前检查用户名是否唯一。所有的工作都很好,这是我迄今为止的代码(请注意,我已经稍微修改了这个问题的代码) 这是文本框 <input type="te
onblur
事件相关联的函数(确切地说是ng blur
)。函数向后端发送一个Ajax/$http
调用,以在提交表单之前检查用户名是否唯一。所有的工作都很好,这是我迄今为止的代码(请注意,我已经稍微修改了这个问题的代码)
这是文本框
<input type="text" name="displayName" id="displayName" ng-model="user.displayName" ng-blur="checkUserName(user)" />
这是我的节点/猫鼬代码,包含在不同的项目中:
exports.displayName = function (req, res, next, displayName) {
User.find({displayName : displayName}).limit(1).exec(function (err, results) {
if (err) return next(err);
if (!results) return next(new Error('No user found'));
res.jsonp(results || null);
});
};
所有这些都很棒,但是当我在控制台中检查时,我可以看到,当我们有一个匹配时,返回的结果对象包含所有内容,如哈希密码、salt等。。。我想阻止这些在我的对象中返回。因此,我修改了我的后端代码:
exports.displayName = function (req, res, next, displayName) {
User.find({displayName : displayName}).limit(1).exec(function (err, results) {
if (err) return next(err);
if (!results) return next(new Error('No user found'));
// new code
if(results.length !== 0){
var returnObj = results[0];
delete returnObj.hashed_password;
delete returnObj.salt;
delete returnObj._id;
res.jsonp([returnObj] || null)
}else{
res.jsonp(results || null);
}
});
};
现在,当检入Firebug时,成功调用返回的内容(已找到匹配项)返回的对象仍然包含已删除的属性。。。哪里出了问题?我的猜测是,返回对象在原型链的更上层有这些属性,因此它们实际上不会被删除 如果delete操作符成功,它将从对象中完全删除属性。但是,如果对象的原型链上存在同名的属性,则该对象将从原型继承该属性 ~MDN() 您可以使用
hasOwnProperty
来检查这一点,以测试这一理论,但只构建一个您想要的值的动态对象,或者限制从Mongo返回的值,可能更安全
换句话说,使用JavaScript(类似于):
或者,您可以使用聚合框架的$match
和$project
仅从Mongo返回所需的字段。(下面是控制台样式代码,不确定您需要如何对猫鼬进行调整)
编辑:需要指出的是,您可以使用find的project参数来执行与我在底部解决方案中所做的相同的操作,而无需使用聚合框架。我的猜测是,返回对象在原型链的更上层具有这些属性,因此它们实际上不会被删除 如果delete操作符成功,它将从对象中完全删除属性。但是,如果对象的原型链上存在同名的属性,则该对象将从原型继承该属性 ~MDN() 您可以使用
hasOwnProperty
来检查这一点,以测试这一理论,但只构建一个您想要的值的动态对象,或者限制从Mongo返回的值,可能更安全
换句话说,使用JavaScript(类似于):
或者,您可以使用聚合框架的$match
和$project
仅从Mongo返回所需的字段。(下面是控制台样式代码,不确定您需要如何对猫鼬进行调整)
编辑:您可以使用find的project参数执行与我在底部解决方案中相同的操作,而无需使用聚合框架。您试图从Mongoose对象中删除,而不是从实际存储中删除。最简单的改变是:
var returnObj = results[0].toJSON();
delete returnObj.hashed_password;
delete returnObj.salt;
delete returnObj._id;
您也可以选择要包含/排除的字段。您试图从Mongoose对象而不是实际存储中删除。最简单的改变是:
var returnObj = results[0].toJSON();
delete returnObj.hashed_password;
delete returnObj.salt;
delete returnObj._id;
您也可以选择要包含/排除的字段。无助于解决实际问题,但请注意,
res.jsonp([returnObj]|null)
的null
部分永远不会被使用。这一行相当于res.jsonp([returnObj])。数组从来都不是假的。这无助于解决实际问题,但请注意,res.jsonp([returnObj]|null)
的null部分永远不会被使用。这一行相当于res.jsonp([returnObj])
。数组从来都不是假的。我决定在运行中创建一个新的对象,以确保这一点,我正在与时间赛跑!我已经决定在飞行中创建一个新的对象,以确保我在与时间赛跑+1.还可以直接调用delete returnObj.\u doc.hashed\u password
在mongoose对象的这种特殊情况下也应该起作用。已测试。+1。还可以直接调用delete returnObj.\u doc.hashed\u password
在mongoose对象的这种特殊情况下也应该起作用。测试。
db.users.aggregate([
{ $match : { displayName : displayName } },
{ $project : {
displayName : 1,
email : 1
}
}
]);
var returnObj = results[0].toJSON();
delete returnObj.hashed_password;
delete returnObj.salt;
delete returnObj._id;