我一直遇到newUser.save()不是函数的问题。这是我以前用过的猫鼬功能。我正确地需要mongoose并且不确定为什么发生这个错误。欢迎任何帮助。
我得到的错误是TypeError: newUser.save is not a function
我在模型文件夹中的user.js
var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String,
email: String,
password: String,
info: String
});
var User = module.exports = mongoose.model('User', UserSchema);
module.exports.createUser = function(newUser, callback){
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(newUser.password, salt, function(err, hash) {
newUser.password = hash;
newUser.save(callback);
});
});
}
module.exports.getUserByUsername = function(username, callback){
User.findOne({username : username}, callback);
}
module.exports.getUserById = function(id, callback){
User.findById(id, callback);
}
module.exports.checkPassword = function(candidatePass, hash, callback){
bcrypt.compare(candidatePass, hash, function(err, res) {
if(err) throw err;
callback(null, res);
});
}
路由文件夹中的我的users.js
//Mongoose Setup
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect("MY_DB");
var path = require('path');
var appDir = path.dirname(require.main.filename);
var bodyParser = require('body-parser')
var User = require('../models/user.js');
//Express Setup
var express = require('express');
var router = express.Router();
var app = express();
var expressValidator = require("express-validator");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator());
app.use(bodyParser.json());
//Routes
router.get('/register', function(req, res){
res.sendFile(appDir + "/views/register.html");
})
router.post('/register', function(req, res) {
req.check('name', 'Name must be Filled in').notEmpty();
req.check('email', 'Email must be Filled in').notEmpty();
req.check('email', "Invalid Email").isEmail();
req.check('password', 'Password Field must be Filled in').notEmpty();
req.check('password', 'Passwords do not Match').equals(req.body.password2)
var errors = req.validationErrors();
if(errors) res.send(errors)
else{ User.createUser({
name: req.body.name,
email: req.body.email,
password: req.body.password,
info: req.body.user_bio
}, function(){
console.log('User Created');
})
}
})
//Exports
module.exports = router;
答案 0 :(得分:3)
createUser()
是一个常规函数,您将常规对象(作为newUser
参数)传递给:
User.createUser({
name : req.body.name,
...
}, ...);
常规对象没有.save
方法。
您可能想要的是在模型中创建static method。这样您就可以像现在这样调用User.createUser
(注意如何在架构上创建静态方法,而不是模型。此外,您必须在从模式创建模型之前定义静态方法
答案 1 :(得分:3)
你在这里遇到了一些问题。
像这样的东西(用户指你的架构):
var user = new User();
user.name = req.body.name;
user.email = req.body.email;
user.password = req.body.password;
user.info = req.body.user_bio;
user.save().then(function(err, result) {
console.log('User Created');
});
应该更好。您现在不是传递新对象(显然不包含save方法),而是从架构中创建新对象,设置参数,然后保存它。
然后您还必须更改为:
User.pre('save', function(next) {
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(this.password, salt, function(err, hash) {
this.password = hash;
next();
});
});
}
这是一个钩子,每次在用户保存之前都会调用它。