1. ホーム
  2. node.js

[解決済み] Expressjsで、あるコンテキストを渡しながらリダイレクトするには?

2022-03-26 04:27:46

質問

node.jsでWebアプリを作るためにexpressを使用しています。これは、私が持っているものを単純化したものです。

var express = require('express');
var jade = require('jade');
var http = require("http");


var app = express();
var server = http.createServer(app);

app.get('/', function(req, res) {
    // Prepare the context
    res.render('home.jade', context);
});

app.post('/category', function(req, res) {
    // Process the data received in req.body
    res.redirect('/');
});

私の問題は以下の通りです。

で送信されたデータが /category が有効でない場合、追加のコンテキストを / ページがあります。どうすればよいのでしょうか?リダイレクトでは、何らかの追加パラメータを許可していないようです。

どうすればいいですか?

異なるルートにデータを渡すには、いくつかの方法があります。 最も正しい答えは、もちろんクエリ文字列です。 その際、値がきちんと エンコードURIComponent decodeURIComponent .

app.get('/category', function(req, res) {
  var string = encodeURIComponent('something that would break');
  res.redirect('/?valid=' + string);
});

で送信されたパラメータを取得することで、別のルートでそれを捕捉することができます。 req.query .

app.get('/', function(req, res) {
  var passedVariable = req.query.valid;
  // Do something with variable
});

よりダイナミックな方法として url コアモジュールがクエリ文字列を生成してくれます。

const url = require('url');    
app.get('/category', function(req, res) {
    res.redirect(url.format({
       pathname:"/",
       query: {
          "a": 1,
          "b": 2,
          "valid":"your string here"
        }
     }));
 });

したがって、すべてのreqクエリ文字列変数をリダイレクトしたい場合は、単に次のようにします。

res.redirect(url.format({
       pathname:"/",
       query:req.query,
     });
 });

また、Node >= 7.xを使用している場合にも querystring コアモジュール

const querystring = require('querystring');    
app.get('/category', function(req, res) {
      const query = querystring.stringify({
          "a": 1,
          "b": 2,
          "valid":"your string here"
      });
      res.redirect('/?' + query);
 });

もう一つの方法は、セッションで何かを設定することです。 設定方法はこちらをご覧ください が、変数をセットしてアクセスするには、こんな感じです。

app.get('/category', function(req, res) {
  req.session.valid = true;
  res.redirect('/');
});

そしてその後、リダイレクトの後に...

app.get('/', function(req, res) {
  var passedVariable = req.session.valid;
  req.session.valid = null; // resets session variable
  // Do something
});

また、Expressの古い機能を使うという選択肢もあります。 req.flash . 新しいバージョンのExpressでこれを行うには、別のライブラリを使用する必要があります。 基本的には、変数を設定することで、その変数が表示され、次にページにアクセスしたときにリセットされるようになります。 ユーザーにエラーを表示するのに便利なのですが、やはりデフォルトでは削除されています。 EDIT この機能を追加するライブラリを見つけました。

Express アプリケーションで情報をやり取りする方法について、一般的なアイデアを得ることができるかと思います。