3

Express.urlencoded() ミドルウェアによって生成された request.body に少し問題があります。場合によっては__proto__、request.body オブジェクトの最後に追加され、そのように Moongose モデルを開始するために直接使用することはできません。var user = new User(req.body)

例として、node-express-mongoose-demoリポジトリを使用します。すべてのフォームは正常に機能しますが、app.post('/users', users.create)「汚染された」 req.body を受け取ります__proto__

助けてくれてありがとう

4

3 に答える 3

2

問題は、にurlencoded含まれているミドルウェアにあるようExpress 3です。

考えられる解決策は、Express bodyParser ではなく、body-parserモジュールを使用することです。

それ以外の

app.use(express.urlencoded())

あなたは書ける

var bodyparser = require('body-parser')

..........

app.use(bodyparser.urlencoded())

問題はqsモジュール (モジュールが使用するバージョンexpress 3) にあるようです。__proto__ビルドするオブジェクトにa を強制的に追加します。最新バージョンにはこの問題はありません。

于 2016-01-27T19:50:57.113 に答える
0

うーん、これは面白いです。__proto__ノード/v8. 私はマングースがこの種のことをするのを見たことがありません。モデル コンストラクターに渡された属性をモデル/ドキュメント インスタンスに変換するコードは、こちらです。私はそこに疑わしいものは何も見ません。

これがどのような場合に発生するかを正確に把握しurlencodedていますか? これで「汚染」されたユーザーを保存しようとするとどうなりますか? 通常、マングースはスキーマで定義されていないフィールドを無視するだけなので、どうなるでしょうか?

以下のようにミドルウェアを使用してこれを回避できるはずですが (おそらく?)、根本的な原因を特定して理解することに興味があります。underscore/lodash にはomit、ここでうまく機能するものがあります。

var _ = require('lodash');

function unpollute(req, res, next) {
  req.body = _.omit(req.body, '__proto__');
  next();
}
app.use(express.urlencoded());
app.use(unpollute);

その後、ルート ハンドラーが実行req.bodyされると、 __proto__.

于 2013-11-04T20:35:00.033 に答える