【问题标题】:MongoDB/Mongoose some of the model properties undefined in app.jsMongoDB/Mongoose app.js 中未定义的一些模型属性
【发布时间】:2021-03-26 04:20:44
【问题描述】:

我正在使用 Express、NodeJS 和 MongoDB 进行身份验证/会话。

Mongoose 架构如下所示:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema({
  username: { type: String, required: true, },
  email: { type: String, required: true, unique: true, },
  password: { type: String, required: true, },
  SignUpDate: { type: { type: Date, default: Date.now } },
  LastLogin: { type: { type: Date, default: Date.now } },
  loggedin: { type: Boolean, required: false, },
  attempts: { type: Number },
});

module.exports = mongoose.model("User", userSchema);

注册表单只需要用户名、电子邮件、密码,但我想保存签名更新、上次登录、失败的登录尝试等。

在 controller.js 文件中,我有路由,这是有问题的。

exports.register_post = async (req, res) => {
  const { username, email, password } = req.body;
  let user = await User.findOne({ email });

  if (user) {
    req.session.error = "User already exists";
    return res.redirect("/register");
  }

  const hasdPsw = await bcrypt.hash(password, 12);

  user = new User({
    username,
    email,
    password: hasdPsw,
    SignUpDate,
    loggedin: true

  });

  await user.save();
  console.log(user)
  res.redirect("/login");
};

在 App.JS 我有这个

app.post("/register", appController.register_post);

如果我在 Schema 中只使用用户名、电子邮件和密码,一切正常,保存到数据库中。

但如上所述,我明白了

"UnhandledPromiseRejectionWarning: ReferenceError: SignUpDate is not 定义”

如果我在 /register 路由上提交注册按钮。另一个问题,如果我想获得 Mongoose 的时间戳,是否必须拨打 Date.now() 以及在哪里?

或者我是否必须在用户注册后定义并添加/推送不是用户通过 Signup Post ( SignUpDate,LastLogin:,loggedin:,attempts ) 提供的属性到架构?我是使用 Mongoose 的新手,浏览了文档,但似乎找不到如何添加时间戳。

一点更新,如果我在 post 函数中注释掉 SignUpDate,LastLogin 变量,我在 MongoDBcompass 中得到“对象,对象”并且对象是可折叠的,它将值保存在数据库中但应用程序崩溃了。必要的改变很简单

   SignUpDate: { type: { type: Date, default: Date.now } },
   LastLogin: { type: { type: Date, default: Date.now } },

 SignUpDate: {
 type: Date, default: Date.now(),

},
LastLogin: {
type: Date, default: Date.now(),

}

这就是它在数据库中的样子,它会被保存并且应用程序不会崩溃。但是一旦我在路由函数中取消注释“SignUpDate”,我就会再次收到相同的未定义错误。

我可以忍受这个,但宁愿不要。此外,如何将“type: Date, default: Date.now()”转换为“Sun May 10 2015 19:50:08 GMT-0600 (MDT)”之类的好输出?如果我在Schema,它不起作用,如果我在路由函数中更改它,它不会让我链接函数,而且我不知道在哪里声明 var 以获得漂亮的格式化输出。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    删除“SignUpDate”:

    const user = new User({
        username,
        email,
        password: hasdPsw,
        loggedin: true
      });
    

    如果您指定了默认值,则在创建新对象时无需指定它。 如果要累积尝试不成功的次数,则需要从base中获取用户,将counter加1并在base中更新。像这样的:

    let userAttempts = await User.findOne({ username });
    await User.update({ username }, { $set: { attempts: userAttempts.attempts + 1 } });
    

    【讨论】:

    • 我刚刚意识到它无论如何都可以工作,只要它是在 Schema 中定义的。感谢那。但是我应该如何在 Schema 中定义它以获得格式良好的日期?如果我想在 { var time } 内 3 或 5 次登录失败后锁定帐户,则处理日期非常重要。
    • @ptts 使用库 'date-fns',您在方案中的字段将如下所示: date: { type: String, default: format(new Date(), 'yyyy/MM/ dd'), },
    • 我刚刚尝试使用日期输入作为出生日期,但未定义相同的“dob”。谢谢会试试那个图书馆
    猜你喜欢
    • 2019-03-18
    • 2023-04-09
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2014-08-07
    相关资源
    最近更新 更多