如何在 express.js 中的两个应用程序方法之间发送数据

How do I send data between two app methods in express.js

假设我有一个 app.js 文件:

const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));

app.get("/login", (req, res) => {
    res.render("login");
});

//From the login.ejs file, a form submitted the values 'email' and 'password'
app.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    res.redirect("/page")
});

app.get("/page", (req, res) => {
    //Now, here I want to use the email and password from the app.post /login
});

这是我目前正在做的一个项目的源代码。 (如果有帮助的话)

源码有点乱,有错误(因为这个问题),但不管怎样,here it is

您可以使用 query stringsession 在路由之间传递数据。

有会话:
运行 下面的命令安装会话库。

$> npm i --save express-session


您需要按照以下步骤操作。

  1. 为每个用户请求创建唯一的 id。 (您可以使用 Date().getTime())。
  2. 在查询字符串中添加这个唯一的 id
  3. 在会话对象中使用此 id 创建一个新密钥。
  4. 将用户名和密码分配给新创建的会话密钥。有了这个,您将能够安全地获得每个用户 email 和密码
  5. page 路由中,从查询字符串中获取 id,然后使用此 id 从会话中检索数据而不会发生冲突。

代码:

const express = require("express");
const bodyParser = require("body-parser");
const session = require('express-session'); // add the session lib
const app = express();
// Session secret key
app.use(session({
    'secret': '343ji43j4n3jn4jk3n'
  }))
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.get("/login", (req, res) => {
    res.render("login");
});
//From the login.ejs file, a form submitted the values 'email' and 'password'
app.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    let id = new Date().getTime();
    req.session[id] = { email, password};   
    res.redirect(`/page?id=${id}`)
});
app.get("/page", (req, res) => {
    let id = req.query.id;
    let email = req.session[id].email;
    let password = req.session[id].password
    //Now, here I want to use the email and password from the app.post /login
});

查询字符串示例:

Not recommended to add the password in the query string.

const express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.get("/login", (req, res) => {
    res.render("login");
});
//From the login.ejs file, a form submitted the values 'email' and 'password'
app.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    res.redirect(`/page?email=${email}&password=${password}`)
});
app.get("/page", (req, res) => {
    let email = req.query.email;
    let password = req.query.password
    //Now, here I want to use the email and password from the app.post /login
});

遗憾的是,在您能够安全地识别出是同一个人拨打第二个电话之前,这是不可能的。 res.redirect 的工作方式是指示浏览器进行第二次调用,并且由于所有请求处理程序彼此独立,因此上下文丢失了。出于此演示目的,您可能只使用 sessions.