2016-07-16 12 views
0

私はセットアップにユーザーが入力エラーをレンダリングし、速達でプロパゲーションを停止するためのシンプルなシステムをしようとしているが、これは私がこれまで持っているものです:ヘルパー関数の中で次の呼び出しですか?

routingFunction= (req, res, next) { 
    //setting up a test in express-validator 
    var test = req.assert('access_token', 'required').notEmpty(); 
    isValid(test, next); 
    //non error stuff 
} 

isValid = (tests, next) => { 
    //some more code here, that checks if any errors were found and save tem to the array errors. 
    if(errors.length > 0){ 
     return next(new Error()); 
    } 
}; 

//a middleware that catches errors: 
app.use((err, req, res, next) => { 
    res.json('error').end(); 
}); 

これで私の問題は、それはdoesnのことですNext(new Error());を呼び出すときに伝播を停止すると、true/falseをisValidから返してから次の(新しいError())を返すことができますが、それはコントローラに膨らんでしまうでしょう。ヘルパー関数の中から?

答えて

0

メインルートファイルにあります。あなたは、例えば、1にバリに参加できmiddlewares/validator.js

let v = require('validator-func-list'); 
... 
exports.isTokenSet = function (req, res, next) { 
    if (v.isValid(req.body.token)) 
     next(); // Forwarding to next middleware. In our route next() called v.isEmail 
    else 
     next(new Error('Token is empty')); // Stop route chain and call error-middleware; 
} 

exports.isEmail = function (req, res, next) { 
... 

routes/index.js

// Set of func(req, res, next) 
let v = require('validator'); // middleware-validators 
let user = require('user'); // routes for user 
... 
app.get('/smth-route-of-user', v.isTokenSet, v.isEmail, ..., user.get) 

checkUser()を呼び出し、ルート内の1つだけを使用します。

app.jsmiddlewares/errorHandler.js

module.exports = function (err, req, res, next) { 
    let msg = err.message; // Here we see 'Token is empty'; 

    if (req.xhr) 
     res.json(msg); 
    else 
     res.render('error_page.html', {message: msg, ...}); 

    // Here we can call next(err) to forwarding error to next errorHandler. In example below it was errorHandler2. 
} 

でアプリケーションにエラー・ミドルウェアを添付することを忘れないでください。

app.use(require('middlewares/errorHandler')); 
app.use(require('middlewares/errorHandler2')); 

エラーを収集する必要がある場合、バリデータは(あなたが望むとして、あるいは別のフィールド)req.errorsにエラーを押して、エラーなしでnext()を呼び出す必要があります。レンダリングミドルウェアでは、単純にreq.errors.lengthをチェックし、正常またはエラーページを表示します。

+0

などの詳細

routingFunction = (req, res, next) { var test = req.assert('access_token', 'required').notEmpty(); if (!isValid(test, next)) return; // callback called by isValid. It's dust. //non error stuff ... next(); // callback must be called } isValid = (tests, next) => { if(errors.length > 0){ next(new Error()); return false; } return true; }; 

より良い使用はかなり、私のセットアップは、私が持っている問題は、実行され、次の(新しいError() 'と、その関数'した後、それはそう、ということである。このisValid関数のように、コード '// non error stuff'を返して実行しますが、検証は行われなかったので、これは嫌です。 – Himmators

0

isValid(test, next);以降のコードが常に実行されます。下のコードはそれをブロックしますが、imhoは汚いです。この

routingFunction = (req, res, next) { 
    var test = req.assert('access_token', 'required').notEmpty(); 
    if (!isValid(test)) 
     return next (new Error('error description')); 

    //non error stuff 
    ... 
    next(); 
}