2016-10-03 9 views
0

私はユーザーを登録するためのルートを作成しています。名前、電子メール、パスワードの3つの必須フィールドがあります。POST要求のフィールドがないとエラーが発生しますか?

不足しているフィールドをどのように処理すればよいですか?

このようにします。

function(req, res) { 

    if(!req.body.name || !req.body.email || !req.body.password) { 

     res.status(400).json({ 
      "message": "All fields required" 
     }); 
     return; 

    } 
} 

または私はエラーをスローし、このように私のエラーハンドラに渡す必要があります。

function(req, res, next) { 

    if(!req.body.name || !req.body.email || !req.body.password) { 

      return next(new Error('All fields required')); 

    } 
} 

答えて

0

フィールドが空の場合にのみ、検証のために、最善の方法は、前に検証しています。 HTML 5を使用する場合は、入力にrequireを使用することができます。この方法では、フォームはサブミットされません。しかし、javascriptでもこれは問題ではありません。

+0

を検証することができ、すべてのユースケースのフロントエンドの検証がいいですユーザーのために、フロントエンドの検証に依存することは決してありません。要求がフォームから来ていない場合は、むしろ悪意のあるボットやプログラマーがSQLインジェクションでカール要求を送信している場合はどうなりますか? – pfuri

+0

ケース提案については、そうではありません。 OP投稿としてのコードは、値が空の場合にのみ有効で、私の答えはこれを明示的に示しています。 –

+0

バックエンドとフロントエンドの両方を保護したい。 – Lev

0

最初のオプションは間違いありません。もしもあなたがエラーミドルウェアを持っていないなら、2番目のものはサーバをクラッシュさせるかもしれません。たとえエラーミドルウェアがあったとしても、おそらくデフォルトの500〜400を返すことが適切な応答です。

+0

なぜサーバーがクラッシュするのだろうか?私は、アプリケーションの最後にエラーハンドラがあります。 – Lev

+0

ええ、申し訳ありませんが、私は最初にそれを逃しました....エラーミドルウェアはそれを処理する必要があります。 私はそれを両方の方法で行っています...ステータスを持つエラーを投げ、すぐに応答することによって。私は予期しない(500)エラーのためにエラーミドルウェアを予約するのが好きです - あなたのハンドラにあなたの予想されるエラーを置きます。しかし、どちらも理論的にはうまくいくだろう。あなたがエラーミドルウェアにステータスを伝えていないので、おそらくこの例でそれを持っている方法は素晴らしいことではありません。 –

0

必要なフィールドの場合、サーバーで確認してさらに読み込むのではなく、フロントエンドで簡単に行うことができます。それを行うには複数の方法があります。 HTMLでは、required属性があります。この属性はtrueに設定することができ、これらの必須フィールドがすべて満たされるまでフォームを送信しません。

エラーの処理方法をさらに細かく制御するには、フォーム検証メソッドを使用してフォームを検証し、空白および/または無効なフィールドをチェックする(フォーム検証)。これは、jQuery、プレーンな古いJS、角度、またはクライアント側で使用したいものを使用して行うことができます。

完全にサーバー側にしたい場合は、空のオブジェクト属性をチェックしてエラーを返す最初のオプションJSONはどうやってやるのですか?

0

ミドルウェアを使用して、エンドポイントが想定しているものを取得できることを確認できます。 Express Validator

インクルードしてみてください。あなたは、本体内のフィールドを確認することができますいずれかのエンドポイントで、その後

app.use(express.bodyParser()); 
app.use(expressValidator([])); // place after bodyParser 

var expressValidator = require('express-validator') 

、パラメータ、またはクエリ別途よう

req.checkBody('age', 'Invalid Age').notEmpty().isInt(); //required integer 
    req.checkBody('name', 'Invalid Name').notEmpty().isAlpha(); //required string 
    req.checkBody('name', 'Invalid Name').isAlpha(); // not required but should be string if exists 

    //for params use req.checkParams and for query req.checkQuery 

var errors = req.validationErrors(); 
    if (errors) { 
    res.send(errors).status(400); 
    return; 
    } 

するか、次のことができます別のファイルでスキーマを定義して使用します。のは、validationSchemasディレクトリ

module.exports = { 
'name': { 
    optional: true, 
    isLength: { 
     options: [{ min: 3, max: 15 }], 
     errorMessage: 'Must be between 3 and 15 chars long' 
    }, 
    errorMessage: 'Invalid Name' 
    }, 
'email': { 
    notEmpty: true, 
    isEmail: { 
     errorMessage: 'Invalid Email' 
    } 
    }, 
    'password': { 
    notEmpty: true, 
    errorMessage: 'Invalid Password' // Error message for the parameter 
    } 
} 

と検証の時点での車内userSignUp.jsを言ってみましょう:

var userSignUpSchema = require('./validationSchemas/userSignUp.js); 

req.checkBody(userSignUpSchema); 
     if (req.validationErrors()) { 
     res.send(errors).status(400); 
     return; 
     } 

あなたが別のスキーマファイルを追加し、フィールドに

関連する問題