2016-05-30 9 views
7

newUser.save()は関数ではありません。これは私が以前使用してきたマングース関数です。私はモンゴースを正しく必要とし、なぜこのエラーが発生しているのか分からない。どんな助けも歓迎されます。.save()は関数ではありません。Mongoose

私は取得していますエラーがTypeError: newUser.save is not a function

マイuser.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; 

答えて

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

マイusers.jsですあなたがレギュラを通過している通常の機能です

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

定期的なオブジェクトが.saveメソッドを持っていない:rとオブジェクト(newUser引数として)。

とすれば、おそらくはモデルの一部として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'に渡します。しかし、tbh、コードワイズなプロジェクトはそれほど素晴らしいものではありません。 1つは、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。 User.preの代わりにおそらくUserSchema.preです。 –

+0

私はそれを動作させる別の方法を考え出した、それはずっと簡単だった、助けてくれてありがとう。一度にすべてを行うのではなく、createUserを呼び出す前にnewUserを作成する必要がありました –

関連する問題