'this'在Mongoose预保存挂钩中未定义

Tom*_*ley 15 mongoose mongodb node.js ecmascript-6

我为User实体制作了一个Mongoose数据库模式,并希望在updated_at字段中添加当前日期.我正在尝试使用.pre('save', function() {})回调,但每次运行它时都会收到一条错误消息,告诉我this未定义.我也决定使用ES6,我想这可能是一个原因(尽管一切正常).我的Mongoose/Node ES6代码如下:

import mongoose from 'mongoose'

mongoose.connect("mongodb://localhost:27017/database", (err, res) => {
  if (err) {
    console.log("ERROR: " + err)
  } else {
    console.log("Connected to Mongo successfuly")
  }  
})

const userSchema = new mongoose.Schema({
  "email": { type: String, required: true, unique: true, trim: true },
  "username": { type: String, required: true, unique: true },
  "name": {
    "first": String,
    "last": String
  },
  "password": { type: String, required: true },
  "created_at": { type: Date, default: Date.now },
  "updated_at": Date
})

userSchema.pre("save", (next) => {
  const currentDate = new Date
  this.updated_at = currentDate.now
  next()
})

const user = mongoose.model("users", userSchema)
export default user
Run Code Online (Sandbox Code Playgroud)

错误消息是:

undefined.updated_at = currentDate.now;
                       ^
TypeError: Cannot set property 'updated_at' of undefined
Run Code Online (Sandbox Code Playgroud)

编辑:通过使用@ vbranden的答案并将其从词法函数更改为标准函数来解决此问题.然而,我有一个问题,虽然它不再显示错误,但它没有更新updated_at对象中的字段.我通过更改this.updated_at = currentDate.now为修复此问题this.updated_at = currentDate.

vbr*_*den 60

问题是你的箭头函数使用lexical这个https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

更改

userSchema.pre("save", (next) => {
  const currentDate = new Date
  this.updated_at = currentDate.now
  next()
})
Run Code Online (Sandbox Code Playgroud)

userSchema.pre("save", function (next) {
  const currentDate = new Date()
  this.updated_at = currentDate.now
  next()
})
Run Code Online (Sandbox Code Playgroud)