1

Node/Express と Jade を使用してビルドとアプリを作成しています。

フォーム入力をサニタイズして検証し、これを MongoDB に保存する POST ルートがあります。このフォーム入力が検証されない場合、ルートはエラーをスローし、エラー ハンドラーはこの同じページを再レンダリングします...

そして、ここで問題が発生します。この再レンダリングでは、フォームの値を事前に書き込んで、ユーザーが修正できるようにしたい... ユーザーがすべてを書き直さなければならないクリーンなフォームは必要ありません。

req.body (サニタイズ済み) データを再レンダリングされたページに送信しようとしましたが、うまくいきました。しかし、私の Jade ビューでこのデータを使用しようとすると、この req.body データが定義されていないときに Node が出力してエラーになります... このページに初めて入ったときのように、まだ間違った入力を入力していません。

これをうまく解決するにはどうすればよいでしょうか?

4

1 に答える 1

1

編集 -コード サンプルがないと、私の例が必要以上かどうかわかりません。

フォームの POST 要求ハンドラー内でフォーム テンプレートをすぐにレンダリングする場合は、おそらく を含める必要はありませんreq.session。適切なローカルを保存して、テンプレートをレンダリングするだけです。

リダイレクトする必要がある場合、または複数のリクエストで値を使用できるようにする必要がある場合は、req.session以下に示すように保存できます。

いずれにせよ、Jade テンプレートがすべてのケースを処理することを確認してください。私の例では、if(locals.savedValues)デフォルトまたは保存された値をフォームに書き込むかどうかをテストして決定します。

最後に、エラーが jade 関連でない場合は、そのエラーを貼り付けてください。


req.session を使用して値を保存します。localsフォームをレンダリングする前に、保存された値または null を表す変数を設定します。

app.get('/form', function(req, res){
  res.locals.savedValues = req.session.savedValues || null;
  res.locals.savedErr = req.session.savedErr || null;
  res.render('form');
});

app.post('/form', function(req, res){
  var values = {
    name: req.body.name,
    email: req.body.email,
  };
  validateForm(values, function(err, processed){
    if(err){
      req.session.savedValues = processed; 
      req.session.savedErr = err;
      // req.session.savedValues = values, if you dont want to propose changes
      res.redirect('back');
    } else {
      delete req.session.savedValues;
      delete req.session.savedErr;
      res.redirect('/success');
    };
  });
});

jade テンプレートで、両方のケースを処理します。

if(locals.savedErr)
  span.error=locals.savedErr
form(action='form', method='post')
  if(locals.savedValues)
    input#name(type='text')=locals.savedValues.name
    input#email(type='text')=locals.savedValues.email
  else
    input#name(type='text')
    input#email(type='text')
于 2013-09-25T15:21:34.187 に答える