在传递一些上下文时如何在expressjs中重定向?

我正在使用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无效,我想向/页面传递一些其他上下文我该怎么办?重定向似乎不允许任何额外的参数。

宝儿理查德2020/03/20 13:47:12

这是我建议不使用任何其他依赖项的建议,仅使用node和express,使用app.locals,这是一个示例:

    app.get("/", function(req, res) {
        var context = req.app.locals.specialContext;
        req.app.locals.specialContext = null;
        res.render("home.jade", context); 
        // or if you are using ejs
        res.render("home", {context: context}); 
    });

    function middleware(req, res, next) {
        req.app.locals.specialContext = * your context goes here *
        res.redirect("/");
    }
神无小胖2020/03/20 13:47:12

我必须找到另一个解决方案,因为提供的解决方案实际上都无法满足我的要求,原因如下:

  • 查询字符串:您可能不希望使用查询字符串,因为URL可以由您的用户共享,有时查询参数对其他用户没有意义。例如,诸如之类的错误?error=sessionExpired绝对不要偶然显示给其他用户。

  • req.session:您可能不想使用它,req.session因为您需要使用Express-Session依赖关系,包括建立一个会话存储(例如MongoDB),您可能根本不需要它,或者您已经在使用自定义会话存储解决方案。

  • next():您可能不想使用,next()或者next("router")因为这实际上只是在原始URL下呈现新页面,所以它实际上并不是重定向到新URL,更像是转发/重写,这可能是不可接受的。

因此,这是我的第四个解决方案,没有任何前述问题。基本上,它涉及使用临时Cookie,您必须首先为其安装cookie-parser显然,这意味着它仅在启用Cookie且数据量有限的情况下才能使用。

实施示例:

var cookieParser = require("cookie-parser");

app.use(cookieParser());

app.get("/", function(req, res) {
    var context = req.cookies["context"];
    res.clearCookie("context", { httpOnly: true });
    res.render("home.jade", context); // Here context is just a string, you will have to provide a valid context for your template engine
});

app.post("/category", function(req, res) {
    res.cookie("context", "myContext", { httpOnly: true });
    res.redirect("/");
}