330

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

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検証されないことがわかった場合は、追加のコンテキストをページに渡したいと思い/ます。どうすればこれを行うことができますか? リダイレクトは、いかなる種類の追加パラメーターも許可していないようです。

4

10 に答える 10

451

異なるルートにデータを渡す方法はいくつかあります。もちろん、最も正しい答えはクエリ文字列です。値が適切にencodeURIComponentおよび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
});

より動的な方法として、urlcore モジュールを使用してクエリ文字列を生成できます。

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 でこれを行うには、別のライブラリを使用する必要があります。基本的に、次にページに移動したときに表示およびリセットされる変数を設定できます。ユーザーにエラーを表示するのに便利ですが、デフォルトでは削除されています。編集:この機能を追加するライブラリが見つかりました。

これで、Express アプリケーションで情報をやり取りする方法の一般的なアイデアが得られることを願っています。

于 2013-09-26T20:26:54.177 に答える
50

routeHandlers 間でデータを渡す最も簡単な方法はnext()、リダイレクトやセッションをいじる必要がありません。homeCtrl(req,res)必要に応じて、の代わりにyour を呼び出して、 andnext()を渡すことができますreqres

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


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

/////////////
// Routing //
/////////////

// Move route middleware into named
// functions
function homeCtrl(req, res) {

    // Prepare the context
    var context = req.dataProcessed;
    res.render('home.jade', context);
}

function categoryCtrl(req, res, next) {

    // Process the data received in req.body
    // instead of res.redirect('/');
    req.dataProcessed = somethingYouDid;
    return next();
    // optionally - Same effect
    // accept no need to define homeCtrl
    // as the last piece of middleware
    // return homeCtrl(req, res, next);
}

app.get('/', homeCtrl);

app.post('/category', categoryCtrl, homeCtrl);
于 2014-07-01T15:05:31.517 に答える
-1

app.js (エントリ ポイント)で非常にシンプルだが効率的な手法を使用します。次 のような変数を定義します。

let authUser = {};

次に、ルートページから割り当てます(ログイン成功後のように)

authUser = matchedUser

最善のアプローチではないかもしれませんが、私のニーズには合っています。

于 2021-01-06T07:59:03.427 に答える