The object "this" is "{}" when logged to the console inside a Schema method. This occurred one day ago and I've been reading up tutorials and other stack overflow questions, but to no luck have I found a solution as to why.
在Schema方法中记录到控制台时,对象“this”为“{}”。这发生在一天前,我一直在阅读教程和其他堆栈溢出问题,但没有运气,我找到了解决方案,为什么。
Here is my model:
这是我的模型:
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);
And this is how I use it (I've marked where the break happens):
这就是我使用它的方式(我已经标记了发生中断的地方):
//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 });
});
});
Does anyone know the problem of this?
有谁知道这个问题?
1 个解决方案
#1
22
The problem might be related to the fact that you're using ES6 arrow syntax instead of a plain function as the callback. ES6 arrow functions change the semantics of the this
keyword, which might affect how mongoose handles the callback internally.
问题可能与您使用ES6箭头语法而不是普通函数作为回调这一事实有关。 ES6箭头函数更改了this关键字的语义,这可能会影响mongoose在内部处理回调的方式。
Try
UserSchema.pre("save", function(next) {
// ...
});
instead of
UserSchema.pre("save", (next) => {
// ...
});
#1
22
The problem might be related to the fact that you're using ES6 arrow syntax instead of a plain function as the callback. ES6 arrow functions change the semantics of the this
keyword, which might affect how mongoose handles the callback internally.
问题可能与您使用ES6箭头语法而不是普通函数作为回调这一事实有关。 ES6箭头函数更改了this关键字的语义,这可能会影响mongoose在内部处理回调的方式。
Try
UserSchema.pre("save", function(next) {
// ...
});
instead of
UserSchema.pre("save", (next) => {
// ...
});