2016-05-30 40 views
7

我不斷收到一個問題,即newUser.save()不是函數。這是我以前用過的貓鼬功能。我正確地要求貓鼬,並且不確定爲什麼發生這個錯誤。歡迎任何幫助。.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); 
    }); 
} 

我的路由文件夾

//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; 

回答

3

createUser()內users.js是一個正規的函數,你正在通過一個規則ř對象(作爲newUser參數)到:

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

普通對象沒有一個.save方法。

可能想要創建一個static method作爲您的模型的一部分。這將使你打電話User.createUser像你現在正在做(注意如何靜態方法對架構,而不是模型創建的。此外,你必須之前定義靜態方法創建從架構模型)

+0

我在編寫我的代碼時引用了https://github.com/bradtraversy/loginapp/blob/master/models/user.js。爲什麼這個工作和我的工作不是? –

+0

查看[該代碼如何使用](https://github.com/bradtraversy/loginapp/blob/master/routes/users.js#L41-L51)。它首先實例化一個新用戶,並將其傳遞給'createUser'。但是,從代碼角度來看,這個項目看起來並不是那麼好。首先,它不使用Mongoose提供的工具(就像我在我的答案中提到的靜態方法)。 – robertklep

4

這裏有一些錯誤。

像這樣的東西(用戶是指您的模式):

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

這是一個鉤,這就是所謂每次用戶會保存之前的時間。

+0

我將掛鉤放入哪個文件? –

+0

您的架構。 user.js在你的情況。順便說一句,可能是UserSchema.pre而不是User.pre。 –

+0

我想出了一個不同的方式來使它工作,這是非常簡單的,謝謝你試圖幫助。我只需要在調用createUser之前創建新用戶,而不是一次完成所有操作 –

相關問題