mongoose对象方法不是一个函数

我正在尝试创build一个注册用户的路线,但是我碰到了一个问题。 当击中/register路线时,我得到以下错误:

 TypeError: user.setPassword is not a function at 

这是我的代码:

车型/ Users.js

 var mongoose = require('mongoose'); var crypto = require('crypto'); var jwt = require('jsonwebtoken'); var UserSchema = new mongoose.Schema({ username: {type: String, lowercase: true, unique: true}, hash: String, salt: String }); UserSchema.methods.setPassword = function(password){ this.salt = crypto.randomBytes(16).toString('hex'); this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); }; UserSchema.methods.validPassword = function(password) { var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); return this.hash === hash; }; UserSchema.methods.generateJWT = function() { // set expiration to 60 days var today = new Date(); var exp = new Date(today); exp.setDate(today.getDate() + 60); return jwt.sign({ _id: this._id, username: this.username, exp: parseInt(exp.getTime() / 1000), }, 'SECRET'); }; mongoose.model('User', UserSchema); 

路线/ index.js

 var express = require('express'); var router = express.Router(); var passport = require('passport'); var mongoose = require('mongoose'); var User = mongoose.model('User'); router.post('/register', function(req, res, next){ if(!req.body.username || !req.body.password){ return res.status(400).json({message: 'Please fill out all fields'}); } var user = new User(); user.username = req.body.username; user.setPassword(req.body.password); user.save(function (err){ if(err){ return next(err); } return res.json({token: user.generateJWT()}) }); }); module.exports = router; 

app.js

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); //MongoDB Setup var mongoose = require('mongoose'); require('./models/Users'); mongoose.connect('mongodb://localhost/images'); var passport = require('passport'); require('./config/passport'); var routes = require('./routes/index'); var app = express(); app.use(passport.initialize()); . . . module.exports = app; 

我对MEAN堆栈相当陌生,经过几个小时的search,我看不出为什么出错了。

尝试做到这一点:

车型/ Users.js

 var mongoose = require('mongoose'); var crypto = require('crypto'); var jwt = require('jsonwebtoken'); var UserSchema = new mongoose.Schema({ username: {type: String, lowercase: true, unique: true}, hash: String, salt: String }); UserSchema.methods.setPassword = function(password){ this.salt = crypto.randomBytes(16).toString('hex'); this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); }; UserSchema.methods.validPassword = function(password) { var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); return this.hash === hash; }; UserSchema.methods.generateJWT = function() { // set expiration to 60 days var today = new Date(); var exp = new Date(today); exp.setDate(today.getDate() + 60); return jwt.sign({ _id: this._id, username: this.username, exp: parseInt(exp.getTime() / 1000), }, 'SECRET'); }; // exports the user schema module.exports = mongoose.model('User', UserSchema); 

路线/ index.js

 var express = require('express'); var router = express.Router(); var passport = require('passport'); var mongoose = require('mongoose'); var User = require('models/user'); // require the user model in the correct path // line removed //var User = mongoose.model('User'); router.post('/register', function(req, res, next){ if(!req.body.username || !req.body.password){ return res.status(400).json({message: 'Please fill out all fields'}); } var user = new User(); user.username = req.body.username; user.setPassword(req.body.password); user.save(function (err){ if(err){ return next(err); } return res.json({token: user.generateJWT()}) }); }); module.exports = router; 

让我知道这个是否奏效。

滑稽:总是确保你的文件没有保存在一个时髦的位置。 我在我的stylesheets/文件夹中有一个Users.js的副本,这是我一直在工作的副本。 在models/在此期间的副本充满了容易被发现的小虫子的东西。