gpt4 book ai didi

node.js - 如何在 mongoose + express 的模式上使用方法

转载 作者:可可西里 更新时间:2023-11-01 10:34:09 26 4
gpt4 key购买 nike

当我尝试从 exports.index.post 运行 user.comparePassword 时出现以下错误(见下文)——我粘贴了所有代码以帮助缩小问题范围。 UserSchema.pre('save') 方法工作正常,但不是 ./routes/account.js 中的方法(我使用的是 mongoose 3)

这是我得到的错误。

Caught exception: [TypeError: Object { username: 'test4',
email: 'test4@test.com',
password: '$2a$10$Ix5vCuVYGIU7AmXglmfIxOyYnF6CiPJfw9HLSAGcRDxMJEttud/F6',
_id: 505fee7ce28f10711e000002,
__v: 0 } has no method 'comparePassword']





## ./app.js

app.post('/account', routes.account.index.post);


## ./models/user.js

var mongoose = require('mongoose')
, bcrypt = require('bcrypt')
, Schema = mongoose.Schema
, db = mongoose.createConnection('localhost', 'mydb');

var UserSchema = new Schema({
username : { type: String, required: true, index: { unique: true }, trim: true }
, email : { type: String, required: true, index: { unique: true }, trim: true, lowercase: true }
, password : { type: String, required: true, trim: true }
});

UserSchema.pre('save', function(next) {
var user = this;

// only hash the password if it has been modified (or is new)
if (!user.isModified('password')) return next();

// generate a salt
bcrypt.genSalt(function(err, salt) {
if (err) return next(err);

// hash the password along with our new salt
bcrypt.hash(user.password, salt, function(err, hash) {
if (err) return next(err);

// override the cleartext password with the hashed one
user.password = hash;
next();
});
});
});

//compare supplied password
UserSchema.methods.comparePassword = function(candidatePassword, cb) {
bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
if (err) return cb(err);
cb(null, isMatch);
});
};

module.exports = db.model('User', UserSchema);


##./routes/account.js



/*
* GET account home page.
*/

exports.index = {};
exports.index.get = function(req, res){
var d = { title: 'Edit account' };
res.render('account', { d: d } );
};

exports.index.post = function(req, res){
req.assert('email', 'Enter email').notEmpty().isEmail();
req.assert('password', 'Enter password').notEmpty().isAlphanumeric().len(5,20);

//user must confirm password
if ( req.body.password_new ) {
req.assert('password_new', 'Enter password').notEmpty().isAlphanumeric().len(5,20);
req.assert('password_new_confirm', 'Passwords must match').equals(req.body.password);
}

res.locals.err = req.validationErrors(true);

if ( res.locals.err ) {
var d = { title: 'Edit account' };
res.render('account', { d: d } );
return;
}

var User = require('../models/user')
, mongoose = require('mongoose')
, db = mongoose.createConnection('localhost', 'mydb');

var user = db.model('User', User.UserSchema);
user.find({username: req.session.user.username }, function(err, user){
if ( err ) return next(err);

/*********** THIS IS WHERE THE ERROR OCCURS **************/

user.comparePassword(req.body.password, function(err, isMatch) {
console.log("isMatch", isMatch);
if (err) next(err);

if (!isMatch) {
req.flash('error', 'Woops, looks like you mistyped your password.');
req.session.user = user;
res.locals.user = user;
res.redirect('/account');
return;
}

//user is authenticated
//session length
console.log(req.body);
});

});


};

最佳答案

user.find 查询 0 个或多个文档,因此其回调的第二个参数是文档数组,而不是单个文档。 user.findOne 查询 0 或 1 个文档,因此其回调的第二个参数为 null 或该单个文档。因此,您正尝试在 JavaScript Array 上调用您的模式方法,这当然是行不通的。将 find 调用更改为 findOne,它应该可以工作。

关于node.js - 如何在 mongoose + express 的模式上使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12577263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com