在向用户呈现数据之前删除JSON内容/删除JavaScript对象属性

在向用户呈现数据之前删除JSON内容/删除JavaScript对象属性,javascript,mongodb,angularjs,Javascript,Mongodb,Angularjs,我有一个问题,我不太清楚为什么我不能解决我的问题 我有一个SPA,它是使用AngularJS、Node.JS和MongoDB(Mongoose)构建的。现在在客户端上,我有一个表单来注册一个新用户。表单有一个文本输入,该输入具有与其onblur事件相关联的函数(确切地说是ng blur)。函数向后端发送一个Ajax/$http调用,以在提交表单之前检查用户名是否唯一。所有的工作都很好,这是我迄今为止的代码(请注意,我已经稍微修改了这个问题的代码) 这是文本框 <input type="te

我有一个问题,我不太清楚为什么我不能解决我的问题

我有一个SPA,它是使用AngularJS、Node.JS和MongoDB(Mongoose)构建的。现在在客户端上,我有一个表单来注册一个新用户。表单有一个文本输入,该输入具有与其
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;