2017-05-23 9 views
0

私は、適切なパラメータを持つすべてのput要求とpost要求を検証するミドルウェアをいくつか持っています。私のmochaテストは私のアップデートルートでは失敗し、デバッグ後は私のルータが私の検証ミドルウェアからアップデートリクエストを受けないので認識しましたが、すべてのポストでうまく動作し、同じ場所にミドルウェアをマウントします同じように、時間も同じです。誰でも問題を見つけることができますか?下に私のテストコード、バリデーションミドルウェア、ルートをマウントする場所があります。 server.jsでapp.put( 'url'、middleware)はミドルウェアExpress NodeJを実行しません

//400 middleware 

//this mounts the middleware succesfully 
app.post('/:table', helper.validateParameters); 

//this doesn't 
app.put('/:table', helper.validateParameters); 

私のテストファイルで:

it('should return a 400 error if no parameters are passed', (done) =>{ 

debugger; 

//this runs through the validation middleware 
    request(app) 
    .post('/item/') 
    .set('Authorization', testSuite.tokenHeader) 
    .expect(400) 
    .end(done); 
}); 

... 

it('should return a 400 error if no parameters are passed', (done) => { 

debugger; 

//this doesn't 
    request(app) 
    .put(testSuite.realItemUrl) 
    .set("Authorization", testSuite.tokenHeader) 
    .expect(400) 
    .end(done); 
}); 

helper.jsで:

let validateParameters = (req, res, next) => { 

    debugger; 

    //The route handler never enters here when handling Item.put requests 

    if (!checkProperties(req.params.table, req.body.params)) { 
    //winston.log? 
    return next(ErrorTypes.badRequest()); 
    } 
    else { 
    return next(); 
    } 

} 

... 

let checkProperties = (table, params) => { 

    if (!params) { 
    return false; 
    } 

    var requiredProperties = []; 

    switch(table) { 
    case 'item': 
     requiredProperties = Object.keys(Item.schema.obj); 
     break; 
    case 'match': 
     requiredProperties = Object.keys(Match.schema.obj); 
     break; 
    case 'user': 
     requiredProperties = Object.keys(User.schema.obj); 
     break; 
    } 

    return Object.keys(params).every(parameter => { 
    return requiredProperties.includes(parameter); 
    }); 
} 
+0

'testSuite.realItemUrl'の値を確認しましたか? PUTリクエストにはどんな反応がありますか? – mscdex

+0

私は現在、デバッグ中です(更新リクエストで送信されたパラメータはありません)。私は "200 ok"応答を返します。これはおそらくクエリーが空のパラメーターで処理され、mongoは何も変更しなかったので「okay」で応答するからです。したがって、操作は通常の更新のように進みますが、ミドルウェアでは停止していたはずです。 –

+0

半関連のノートでは、 'req.body.params'が既に存在するので、' validateParameters() 'に' req.body.params && 'の代わりに 'req.params.table &&'本当の理由は、 '!req.body.params || '。私はそれが問題の原因だとは思わない。 'req.body.params'は設定されていますか?もしそうなら、 'checkProperties()'は責任を負いますか?あなたのボディパーサーミドルウェアはどのように定義されていますか?PUTリクエストにもあてはまりますか? – mscdex

答えて

1

解決!私はもともと、このようなプット・リクエストのための私の検証ミドルウェアを搭載し:

app.put("/:table", helper.validateParameters); 

しかし、テストに私が使用したURLは、「ローカルホスト:3000 /マッチ/ 5879234c3232」だったすべては「試合は/」私のtestMatchの_idた後。私のテスト用URLは、検証用ミドルウェアを経由したリクエストと一致しないため、ミドルウェアは決してヒットしませんでした。入力を提供するすべての人に

app.put("/:table/:id", helper.validateParameters); 

ありがとう:私は上の私のミドルウェアを搭載したURLを調整する簡単な修正は、バターのようになめらかな作業すべてをしています。

関連する問題