0

問題があり、なぜ問題を解決できないのかよくわかりません。

AngularJS、Node.JS、および MongoDB (Mongoose) を使用して構築された SPA があります。クライアントには、新しいユーザーを登録するためのフォームがあります。onblurフォームには、そのイベントに関連付けられた (またはng-blur正確には)関数を持つテキスト入力があります。この関数Ajax/$httpは、フォームが送信される前にユーザー名が一意であるかどうかを確認するためにバックエンドに呼び出しを送信します。これまでのところ私のコードは次のとおりです(この質問のコードを少し変更したことに注意してください)...

テキストボックスはこちら

<input type="text" name="displayName" id="displayName" ng-model="user.displayName" ng-blur="checkUserName(user)" />

これが私のコントローラーのぼかし機能です

this.userNameCheck = function(user){
        return $http({method: 'GET', url: '/api/users/displayName/' + user.displayName})
            .then(function(response) {
               if(response.data.length > 0){
                   user.userWarning = userWarning; // userWarning is a string/ var that is passed to the form
               }

            }, function(response) {
                console.log(response);
            });
    };

別のプロジェクトに含まれているノード/マングース コードは次のとおりです。

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);
    });

};

これはすべて素晴らしいことですが、コンソールをチェックインすると、一致すると、返された結果オブジェクトにハッシュ化されたパスワード、ソルトなどのすべてが含まれていることがわかります...これらがオブジェクトに返されないようにしたいと思います. したがって、バックエンド コードを次のように修正しました。

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 でチェックすると (一致が見つかった)、返されたオブジェクトにはまだ削除されたプロパティが含まれています...どこが間違っているのでしょうか?

4

2 に答える 2

3

実際のストレージではなく、Mongoose オブジェクトから削除しようとしています。最も簡単な変更は次のとおりです。

 var returnObj =  results[0].toJSON();
 delete returnObj.hashed_password;
 delete returnObj.salt;
 delete returnObj._id;

含める/除外するフィールドだけをselect(ドキュメント) にすることもできます。

于 2013-10-02T12:16:30.707 に答える
0

私の推測では、戻りオブジェクトにはこれらのプロパティがプロトタイプ チェーンのさらに上にあるため、実際には削除されません。

delete 演算子が成功すると、オブジェクトからプロパティが完全に削除されます。ただし、オブジェクトのプロトタイプ チェーンに同じ名前のプロパティが存在する場合、オブジェクトはそのプロパティをプロトタイプから継承します。

~ MDN ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete )

この理論をテストするためにこれを確認できますがhasOwnProperty、必要な値のオンザフライ オブジェクトを構築するか、Mongo から返される値を制限する方が安全かもしれません。

つまり、オンザフライで JavaScript (次のようなもの) を使用します。

var returnObj =  results[0],
safeUserObj = {
   userName : returnObj["username"],
   email : returnObj["email"]
};

res.jsonp([safeUserObj]);

$matchまたは、集計フレームワークのとを使用して、必要なフィールドのみを Mongo から返すこともできます$project。(以下のコンソールスタイルコード、これをMongooseにどのように適応させる必要があるかわかりません)

db.users.aggregate([
{ $match : { displayName : displayName } },
{ $project : {
    displayName : 1,
    email : 1
  }
}
]);

編集: 集約フレームワークを使用せずに、find のプロジェクト パラメーターを使用して、下のソリューションで行ったのと同じことを行うことができることに言及します。

于 2013-10-02T10:24:54.900 に答える