.save()不是函数Mongoose

我一直得到一个问题,newUser.save()不是一个问题。 这是我以前用过的mongoosefunction。 我需要正确的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; 

createUser()是一个正规的函数,你传递一个正常的对象(作为newUser参数)到:

 User.createUser({ name : req.body.name, ... }, ...); 

常规对象没有.save方法。

可能想要的是创build一个静态方法作为你的模型的一部分。 这将允许你像现在User.createUser那样调用User.createUser (请注意静态方法是如何在模式上创build的,而不是在模型上创build的,而且从模式创build模型之前必须定义静态方法)

你在这里有一些错误。

像这样的东西(用户引用你的模式):

 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'); }); 

应该更好地工作。 而不是传递一个新的对象(显然不包含保存方法),您现在正在从模式创build一个新的对象,设置参数,然后保存它。

那么你也必须改变这个:

 User.pre('save', function(next) { bcrypt.genSalt(10, function(err, salt) { bcrypt.hash(this.password, salt, function(err, hash) { this.password = hash; next(); }); }); } 

这是一个钩子,每次在用户保存之前调用它。