0

Express 3 で新しいメッセージ システムを使用しており、フォームを処理および検証するときにこの問題を把握しました。無効なフォームを送信すると、送信は失敗しますが、エラー メッセージは表示されません。再度送信すると、最後のリクエストのエラー メッセージが表示されます。ローカル セッションと Redis セッションを使用してみましたが、常に同じです。これはデフォルトのエクスプレス プロジェクトです。

app.js

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path');

var app = express();

app.response.message = function(type, msg){
  // reference `req.session` via the `this.req` reference
  var sess = this.req.session;
  // simply add the msg to an array for later
  sess.messages = sess.messages || [];
  sess.messages.push({type: type, msg: msg});
  return this;
};

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(express.static(path.join(__dirname, 'public')));
  app.use(function(req, res, next) {
    console.log('req.session', req.session.messages);
    var msgs = req.session.messages || [];
    res.locals({
      messages: msgs,
      hasMessages: !! msgs.length
    });
    req.session.messages = [];
    next();
  });
});

app.configure('development', function(){
  app.use(express.errorHandler());
});
app.get('*', function(req, res, next) {
  res.message('hello', req.url);
  next();
});
app.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});
app.get('/hello', function(req, res) {
  res.render('index', { title: 'Express' });
});
app.get('/world', function(req, res) {
  res.render('index', { title: 'Express' });
});
http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

インデックス本体追加:

<% if (hasMessages) { %>
  <ul id="messages">
    <% messages.forEach(function(msg){ %>
      <li class="<%= msg.type %>"><%= msg.msg %></li>
    <% }) %>
  </ul>
<% } %>
  1. / メッセージはありません
  2. /hello は「/」を示します
  3. /ワールドショー '/hello'
  4. リロードすると「/world」が表示されます

ここで何が問題なのですか?

4

1 に答える 1

4

それらを延期したくない場合は、セッションをまったく使用する必要はありません。この場合のポイントは、次のレンダリングのためにメッセージを延期することです。ミドルウェアが「messages」と「hasMessages」に値を入力するまでには、前のリクエストで値が入力されていない限り、実際には何もありません。これは通常、「ユーザーが正常に更新されました」などのメッセージを延期するために使用されます。

于 2012-08-13T20:20:58.810 に答える