【问题标题】:Cant´t get cookie - Express无法获取 cookie - Express
【发布时间】:2022-01-12 03:40:03
【问题描述】:

我用 express 创建了一个服务器,并有一些 get/post 路由。

在登录页面中,我有一个显示登录表单的页面:

    app.get("/login", (req, res) => {
  res.send(`<h1>Iniciar sesión</h1>
  <form method='post' action='/login'>
    <input type='email' name='email' placeholder='Email' required />
    <input type='password' name='password' placeholder='Contraseña' required />
    <input type='submit' value='Ingresar' />
  </form>
  <a href='/register'>Registrarse</a`);
});

然后我有一个设置 cookie 的 Post 方法:

    app.post("/login", (req, res) => {
  const { email, password } = req.body;

  const user = users.filter(
    (e) => e.email === email && e.password === password
  );

  if (user.length >= 1) {
    res.cookie("userId", user.id);
    res.cookie("password", user.password);
    res.redirect("/home");
  } else {
    console.log("contraseña incorrecta");
    res.redirect("/login");
  }
});

问题是当我走这条路线时,user.name 和 user.email 是未定义的。换句话说,我无法访问 cookie:

app.get("/home", (req, res) => {
  const id = req.cookies.userId;
  console.log(id); //this is undefined
  const user = users.filter((u) => u.id === id);
  //console.log(user);

  res.send(`
    <h1>Bienvenido ${user.name}</h1>
    <h4>${user.email}</h4>
    <a href='/'>Inicio</a>
  `);
});

建议?

完整代码如下:

const express = require("express");
const morgan = require("morgan");
const cookieparser = require("cookie-parser");
const bodyparser = require("body-parser");

const app = express();

const users = [
  { id: 1, name: "Franco", email: "Franco@mail.com", password: "1234" },
  { id: 2, name: "Toni", email: "Toni@mail.com", password: "1234" },
];

app.use(morgan("dev"));
app.use(cookieparser());
app.use(bodyparser.urlencoded({ extended: true }));

app.use((req, res, next) => {
  console.log(req.cookies);
  next();
});

app.get("/", (req, res) => {
  res.send(`
    <h1>Bienvenidos a Henry!</h1>
    ${
      req.cookies.userId
        ? `<a href='/home'>Perfil</a>
    <form method='post' action='/logout'>
      <button>Salir</button>
    </form>
    `
        : `
    <a href='/login'>Ingresar</a>
    <a href='/register'>Registrarse</a>`
    }
  `);
});

app.get("/register", (req, res) => {
  res.send(`<h1>Registrarse</h1>
  <form method='post' action='/register'>
    <input name='name' placeholder='Nombre' required />
    <input type='email' name='email' placeholder='Email' required />
    <input type='password' name='password' placeholder='Contraseña' required />
    <input type='submit' value='Registrarse' />
  </form>
  <a href='/login'>Iniciar sesión</a>`);
});

app.get("/login", (req, res) => {
  res.send(`<h1>Iniciar sesión</h1>
  <form method='post' action='/login'>
    <input type='email' name='email' placeholder='Email' required />
    <input type='password' name='password' placeholder='Contraseña' required />
    <input type='submit' value='Ingresar' />
  </form>
  <a href='/register'>Registrarse</a`);
});

app.post("/login", (req, res) => {
  const { email, password } = req.body;

  const user = users.filter(
    (e) => e.email === email && e.password === password
  );

  if (user.length >= 1) {
    res.cookie("userId", user.id);
    res.cookie("password", user.password);
    res.redirect("/home");
  } else {
    console.log("contraseña incorrecta");
    res.redirect("/login");
  }
});

app.get("/home", (req, res) => {
  const id = req.cookies;
  console.log(id);
  const user = users.filter((u) => u.id === id);
  //console.log(user);

  res.send(`
    <h1>Bienvenido ${user.name}</h1>
    <h4>${user.email}</h4>
    <a href='/'>Inicio</a>
  `);
});

app.listen(3000, (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log("Listening on localhost:3000");
  }
});

【问题讨论】:

  • 客户端如何访问您期望 cookie 的路由?它只是在浏览器中输入的 URL 吗?或者它是一个 Javascript Ajax 调用?如果是代码,请显示客户端代码。
  • 在浏览器中输入的网址
  • 仅供参考,当然不建议将用户密码以纯文本形式存储在您的服务器上。也不建议将密码放入 cookie 中。

标签: express cookies


【解决方案1】:

你的部分问题是这段代码:

const user = users.filter(
  (e) => e.email === email && e.password === password
);

产生一个数组。所以,user 是一个数组。

因此当你这样做时:

res.cookie("userId", user.id);
res.cookie("password", user.password);

user.iduser.password 都忽略了您在 user[0] 中获得的匹配项,并引用了 user 数组对象上不存在的属性。它们最终会是 undefined,因此为什么 res.cookie() 没有设置一个有意义的值。

你应该这样做:

res.cookie("userId", user[0].id);
res.cookie("password", user[0].password);

但是,请不要在用户的 cookie 中输入密码。应该没有理由这样做。当它是纯文本时更是如此。如果您想知道前一个用户是否登录,请在 cookie 中使用加密安全令牌(如 express-session 使用的东西)。不要将他们的密码放在 cookie 中。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2012-05-08
    • 2018-07-01
    • 1970-01-01
    • 2020-07-19
    • 2020-07-13
    相关资源
    最近更新 更多