web-dev-qa-db-ja.com

ExpressとConnect-Flashを使用して、ページを更新せずにフラッシュメッセージを表示するにはどうすればよいですか?

Express connect-flashは、更新後にのみ表示されます。 コードは読みやすくするために削除されています。

"express": "~4.2.0",
"connect-flash": "~0.1.1",

そしてここに私のapp.js

var express = require('express'),
    favicon = require('serve-favicon'),
    flash = require('connect-flash');
var app = express();
app.use(cookieParser('---'));
app.use(session({
  secret: '---',
  saveUninitialized: true,
  resave: true}));
app.use(flash());

app.use(function(req, res, next) {
  res.locals.messages = req.flash();
  next();
});

私のルートで私は次のようなことを試みました

req.flash('success', {msg: 'Sign Up Success'});
res.redirect('/me/dashboard');

と私のエラー表示msg.jadeテンプレートは

for msg in messages
      div #{msg.msg}

更新/修正後にのみメッセージが表示されます。何が間違っているのか教えてください。

this も見ましたが、時代遅れだと思います

14
niksmac

ミドルウェアでflashメソッドを呼び出していますが、これはミドルウェアの予想される動作です。ミドルウェアは次のリクエストでメッセージを読み取り、ロジックに従ってローカル変数を設定します。

ミドルウェアはどのように機能しますか?

リクエストが着信すると、ラップされたServerResponseオブジェクトと次のコールバックとともに、最初のミドルウェア関数に渡されます。ミドルウェアは、応答オブジェクトのメソッドを呼び出すことによって応答することを決定したり、メソッドnext()を呼び出すことによってスタック内の次のレイヤーに要求を渡すことを決定したりできます。

connect-flash

フラッシュは、メッセージの保存に使用されるセッションの特別な領域です。メッセージはフラッシュに書き込まれ、ユーザーに表示された後にクリアされます。フラッシュは通常、リダイレクトと組み合わせて使用​​され、メッセージがレンダリングされる次のページで使用できるようにします。

更新/リダイレクト後にのみメッセージが表示されますか?

_app.use(function(req, res, next) {
    res.locals.messages = req.flash();
    next();
});
_

上記のミドルウェアはすべてのリクエストを呼び出し、req.flash()値を設定します。このため、次の(後続の)リクエストごとにreq.flash('success', {msg: 'Sign Up Success'});値を取得します。ページをリダイレクト/更新しないと現在のページには表示されません。

この動作をオーバーライドして更新せずに値を取得するには、req.flash()を使用してルーターのフラッシュメッセージに使用できるres.locals.messages = req.flash();関数を呼び出します。

例:-ルーターに新しいフラッシュメッセージを設定した後、ページを更新せずにページに失敗したログインメッセージを表示し、成功したリダイレクトページに表示するには。

_router.post("/login", function (req, res) {
    var username = req.body.username;
    var pwd = req.body.pwd;
    if (username === "demo" && pwd === "demo") {
        req.flash("messages", { "success" : "Sign Up Success" });
        res.redirect("/me/dashboard");
    } else {
        req.flash("messages", { "error" : "Invalid username or password" });
        res.locals.messages = req.flash();
        res.render("login', { title: 'Login"});
    }
});
_

結論:同じページにメッセージを表示するにはルーター自体に値を割り当てて、ミドルウェアの動作をオーバーライドします。

18
rajesh ujade