2016-08-08 17 views
0

私はmongodbにオブジェクトを挿入するときにユーザーが投稿できるフィールドを制限しようとしています。私は私が欄を埋めることを強制することができることを知っていますが、私が望んでいない欄を人がどのように挿入するかを見つけることができないようです。投稿フィールドの挿入を制限

これは私が項目を挿入するために今持っているコードです。

app.post("/obj", function (req, res) { 
    var newObj = req.body; 

    //TODO filter fields I don't want ? 

    if (!(newObj .id || newObj .type)) { 
     handleError(res, "Invalid input", "Must provide a id and type.", 400); 
     return; 
    } 

    db.collection(OBJ_COLLECTION).insertOne(newObj, function(err, doc) { 
     if (err) { 
      handleError(res, err.message, "Failed to create new object."); 
     } else { 
      res.status(201).json(doc.ops[0]); 
     } 
    }); 
}); 

答えて

1

あり、これを行うには可能性がJSのネイティブな方法だが、私はほとんどのプロジェクトのための私のツールボックスとしてLodashを使用する傾向があり、その場合には、私は通常行うことは、セットアップが許可されたフィールドのホワイトリストで、その後のみを抽出そのような投稿値から:

const _ = require('lodash'); 

app.post("/obj", function (req, res) { 
    var newObj = _.pick(req.body, ['id', 'type','allowedField1','allowedField2']); 

これは非常に簡単です、と私は通常、(モデルなどの例)、再使用のためにどこかにホワイトリストを定義します。サイドノートとして

は、私は本当に、自動生成_idフィールドとの混同を避けるためにする必要がない限り、誰かが、新しいオブジェクトのために投稿することができますことをフィールドとして「ID」を使用しないでください。

さらに、モデムベースのドキュメントの制御をもっとしたい場合は、ストレートmongodbドライバを使用するのではなく、mongooseを実際に調べる必要があります。とりわけ、オブジェクトからスキーマに定義されていないフィールドはすべて削除します。私はまだはスキーマで定義されたあること事がある_.pick()メソッドを使用しますが、私は人々が特定のコントローラメソッドで変更する必要はありません。

関連する問題