【问题标题】:Cannot set property "name" of undefined无法设置未定义的属性“名称”
【发布时间】:2019-01-31 17:46:50
【问题描述】:

所以我是 express(和整个后端)的新手,公平地说,我不知道如何使用 sessions(我首先使用 cookie,但后来我听说 sessions 是更好地维护用户的状态)所以我安装了express-session 并且确实像这篇文章一样:

https://stackoverflow.com/a/37608202/5737650

我将会话保存在变量中(sess),然后我用来获取信息,但问题是 sess 似乎只是 cookie 对象,而不是我需要保存的其他信息用户的输入给了我这个错误:

Cannot set property "name" of undefined

这是我的代码,它的工作是注册用户,将数据保存到数据库,然后当它进入登录页面时,它会检查他的输入是否存在于数据库中,如果不存在,那么它会给我一个 @ 987654329@,如果存在,那么它会将数据保存到会话中,以便我以后可以保持其状态,但是当我输入正确的输入时,它会给我上述错误:

// Importing modules/packages
let connection = require("./Connection.js");
let bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
let express = require("express");
let app = express();
var session = require("express-session");
app.use(cookieParser());
app.use(
  session({
    secret: "1E3ESS3DSS4DS4",
    saveUninitialized: true,
    resave: false,
    cookie: {
      path: "/",
      maxAge: 1000 * 60 * 60,
      httpOnly: true
    },
    user: {
      name: "",
      password: "",
      status: ""
    }
  })
);
let urlencodedParser = bodyParser.urlencoded({ extended: false });

// Server and routing
app.listen(3000, function() {});
app.set("view engine", "ejs");
app.get("/Signup", (req, res) => {
  res.render("Register");
});
app.get("/", function(req, res) {
  res.redirect("Login");
});
app.get("/Login", function(req, res) {
  res.render("Login");
});

// Database's Connection
connection.connect(err => {
  if (err) {
    throw "ERROR! " + err;
  }
});

// Requesting and Receiving Data from body parser
app.post("/Signup", urlencodedParser, function(req, res) {
  res.render("Register");
  connection.query(
    `insert into users (Username, User_Password, Email_Address) values ("${
      req.body.Username
    }", ${req.body.Password}, "${req.body.Email}")`,
    function(err) {
      if (err) throw "An error has happened while excuting the query " + err;
      console.log("Query got excuted successfully!");
    }
  );
});

app.post("/Login", urlencodedParser, (req, res) => {
  let sess = req.session;
  console.log(sess);
  connection.query(
    `SELECT Username FROM users WHERE User_Password = ? AND Username = ?`,
    [req.body.Password, req.body.Username],
    function(err, results) {
      if (results.length === 0) {
        console.log(
          "Sorry, this username/password doesn't exist in our database."
        );
      } else {
        console.log("Logined successfully!");
        sess.user.name = req.body.Username;
        sess.user.password = req.body.Password;
        sess.user.status = "online";
      }
      res.render("Login");
    }
  );
});

我如何解决这个问题并获得我想要的结果(保持其状态记录在整个网站上)?

【问题讨论】:

    标签: node.js express session cookies express-session


    【解决方案1】:

    代码中有几个错误。

    1. 最初,会话对象不会有user 对象。因此sess.user 将是undefined。所以第一个错误Cannot set property "name" of undefined 是有道理的。您可能希望先将 sess.user 初始化为空对象。

    2. 有了POST的请求,你需要调用req.session上的.save()来保存它。阅读更多关于它的信息here

    这是我在我的机器上尝试过的代码:

    app.post("/Login", (req, res) => {
        let sess = req.session;
        res.send(sess);
        sess.user = {};
        sess.user.name = req.body.Username;
        sess.user.password = req.body.Password;
        sess.user.status = "online";
        req.session.save();
    });
    

    你可以这样做:

    app.post("/Login", urlencodedParser, (req, res) => {
        let sess = req.session;
        console.log(sess);
        connection.query(
            `SELECT Username FROM users WHERE User_Password = ? AND Username = ?`,
            [req.body.Password, req.body.Username],
            function(err, results) {
                if (results.length === 0) {
                    console.log(
                        "Sorry, this username/password doesn't exist in our database."
                    );
                } else {
                    console.log("Logined successfully!");
                    sess.user = {
                        name: req.body.Username,
                        password: req.body.Password,
                        status: "online"
                    };
                }
                req.session.save();
                res.render("Login");
            }
        );
    });
    

    【讨论】:

    • 嗯,不。你不需要res.send(sess)。我这样做是为了在响应中轻松查看会话变量。关于req.session.save(),建议先看一下我贴的链接,然后具体问一下你不明白的地方
    • 我不清楚你的这一行在问什么 => 为什么 sess.user = {} 为什么不直接制作它{}
    • 是的,sess 是整个会话对象。用户 sess.user.name = 'xxx'sess.name = 'xxx' 完全取决于您(但是,您不能这样做 sess = 'xxx'
    • 谢谢 :) 如果您需要更多帮助,让我们在这里聊天chat.stackoverflow.com/rooms/17/javascript
    • 首先检查req.session.user是否存在,如果存在则检查req.session.user.name是否存在。
    猜你喜欢
    • 2021-08-03
    • 2019-06-23
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多