2016-05-30 21 views
7

değil NewUser.save() işlevinin bir sorunla karşılaşıyorum. Bu daha önce kullanmış olduğum bir fonksiyondur. Mongoose'u doğru bir şekilde gerekli kıldım ve bu hatanın neden oluştuğundan emin değilim. Herhangi bir yardım bekliyor..save() bir İşlev Mongoose

alıyorum hata TypeError: newUser.save is not a function

Benim user.js Modeller Klasör içindeki Rotalar Klasör

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

cevap

3

createUser()

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

Benim users.js olduğunu bir regula geçirdiğiniz normal bir işlevdir için (newUser bağımsız değişken olarak) r nesnesi:

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

Normal nesneler .save yöntem yoktur.

Sizinkine istediğiniz modelinizin bir parçası olarak bir static method oluşturmaktır. Yani yapıyorsun şimdi gibi User.createUser çağrısında bulunma izni verecek (şema değil modeli üzerine nasıl oluşturulduğunu statik yöntemler dikkat edin. Ayrıca, şemadan bir model oluşturma önce statik yöntemler tanımlamak gerekir)

+0

Kod yazarken https://github.com/bradtraversy/loginapp/blob/master/models/user.js adresine atıfta bulunuyordum. Bu neden işe yaramıyor? –

+0

[Bu kod nasıl kullanıldığını öğrenin] (https://github.com/bradtraversy/loginapp/blob/master/routes/users.js#L41-L51). İlk önce yeni bir kullanıcı başlatır ve bunu "createUser" öğesine iletir. Ama tbh, kod-bu proje tüm bu harika görünmüyor. Birincisi, Mongoose'un sağladığı araçları kullanmaz (cevabımda bahsettiğim statik yöntemler gibi). – robertklep

4

Burada bazı şeyler yanlış var. Böyle

şey (Kullanıcı senin şema belirtir):

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

daha iyi çalışması gerekir. Yeni bir nesneyi geçirmekten ziyade (ki bu yöntem kayıt yöntemini içermiyor), şemadan yeni bir nesne oluşturuyorsunuz, parametreleri ayarlıyorsunuz ve sonra kaydediyorsunuz.

Daha sonra da bu geçmek zorunda:

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

Bu kullanıcı kaydedilmesini önce her zaman çağrılan bir kanca vardır.

+0

Kancayı hangi dosyaya koyardım? –

+0

Şemanız. Durumunuzda user.js. Bu arada User.pre yerine UserSchema.pre olur. –

+0

Çalışmasını sağlamak için farklı bir yol buldum, bu çok daha kolaydı, yardım etmeye çalıştığınız için teşekkürler. Sadece bir kerede hepsini yapmak yerine createUser çağırmadan önce yeni Kullanıcı’yı yapmam gerekiyordu –