在Schema方法范围内,“this”在Mongoose 4.4.12中是空的{}

login到Schema方法内的控制台时,“this”对象为“{}”。 这发生在一天前,我一直在阅读教程和其他堆栈溢出问题,但没有运气,我find了一个解决scheme,为什么。

这是我的模型:

var mongoose = require("mongoose"); var Schema = mongoose.Schema; var constants = require("../config/constants"); var bcrypt = require("bcrypt-nodejs"); var UserSchema = new Schema({ name: String, email: String, password: String, authorization: { type: Number, default: constants.authorization.default } }); UserSchema.pre("save", (next) => { var user = this; /** * Only hash the password when it's been modified or if new. */ // ##################################################### // ERROR // if (!query.isModified("password")) // ^ // TypeError: query.isModified is not a function // // user and this == {} // #################################################### if (!user.isModified("password")) { return next(); } /** * hash password */ bcrypt.hash(user.password, null, null, (err, hash) => { if (err) { return next(err); } user.password = hash; return next(); }); }); // ##################################################### // ERROR // user.verifyPassword(req.body.password, match => { // ^ // TypeError: user.verifyPassword is not a function // // this == {} // #################################################### UserSchema.methods.verifyPassword = (reqPassword, callback) => { bcrypt.compare(reqPassword, this.password, (err, match) => { var e = null; var m = match; if (err) { e = err; m = false; } return callback(e, m); }); }; module.exports = mongoose.model("User", UserSchema); 

这就是我如何使用它(我已经标记了中断发生的地方)

 //includes express, mongoose, User, constants. this part is ok. /** * Authenticates a user post request * * @request email string * @request password string * */ router.post("/", (req, res) => { /** * Retrieve the user */ User.find( { email: req.body.email }, (err, user) => { /** * An error occurred */ if (err) { return res.json({ success: false, message: "An mongodb error occurred.", error: err }); } /** * Check for problems with the email or password. */ if (!user) { return res.json({ success: false, message: "Email or password was incorrect." }); } // ########################################################## // ERROR // user.verifyPassword(req.body.password, match => { // ^ // TypeError: user.verifyPassword is not a function // ########################################################## user.verifyPassword(req.body.password, match => { if (!match) { return res.json({ success: false, message: "Email or password was incorrect." }); } /** * User authenticated! */ req.session.user = user; res.json({ success: true, message: "Successfully authenticated." }); }); }); }); router.get("/", (req, res, next) => { var admin = new User({ name: "admin", email: "admin@admin.net", password: "admin", authorization: constants.authorization.admin }); // ######################################################## // ERROR // if (!user.isModified("password")) // ^ // TypeError: user.isModified is not a function // ####################################################### admin.save(function(err) { if (err) { console.log(err); } console.log('User saved successfully'); res.json({ success: true }); }); }); 

有谁知道这个问题?

问题可能与您使用ES6箭头语法而不是普通函数作为callback有关。 ES6箭头函数改变了this关键字的语义,这可能会影响mongoose在内部处理callback。

尝试

 UserSchema.pre("save", function(next) { // ... }); 

代替

 UserSchema.pre("save", (next) => { // ... });