2016-05-30 20 views
7

Tôi tiếp tục gặp sự cố newUser.save() không phải là một hàm. Đây là một chức năng mongoose mà tôi đã sử dụng trước đây. Tôi yêu cầu mongoose chính xác và không chắc chắn lý do tại sao lỗi này xảy ra. Bất kỳ trợ giúp được hoan nghênh..save() không phải là Hàm Mongoose

Các lỗi tôi nhận được là TypeError: newUser.save is not a function

user.js My bên trong thư mục Models

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 My bên trong đường Thư mục

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

Trả lời

3

createUser() là một chức năng thông thường mà bạn đang vượt qua một regula đối tượng r (như đối số newUser) tới:

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

Đối tượng thông thường không có phương pháp .save.

Những gì bạn có thể là muốn tạo một static method như một phần của mô hình của bạn. Điều đó sẽ cho phép bạn gọi User.createUser như bạn đang làm gì bây giờ (chú ý cách phương pháp tĩnh được tạo ra trên schema, không phải là mô hình . Ngoài ra, bạn phải xác định phương pháp tĩnh trước tạo ra một mô hình từ schema)

+0

Tôi đã tham khảo https://github.com/bradtraversy/loginapp/blob/master/models/user.js trong khi viết mã của tôi. Tại sao điều này sẽ làm việc và tôi không? –

+0

Kiểm tra [cách mã đó được sử dụng] (https://github.com/bradtraversy/loginapp/blob/master/routes/users.js#L41-L51). Nó khởi tạo một người dùng mới đầu tiên và chuyển nó tới 'createUser'. Nhưng tbh, code-khôn ngoan rằng dự án không nhìn tất cả những gì tuyệt vời. Đối với một, nó không sử dụng các công cụ mà Mongoose cung cấp (giống như các phương thức tĩnh mà tôi đã gọi trong câu trả lời của tôi). – robertklep

4

Bạn có một số điều sai ở đây.

Something như thế này (Thành viên đề cập đến schema của bạn):

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

nên làm việc tốt hơn. Thay vì truyền một đối tượng mới (mà rõ ràng không chứa phương thức lưu), bạn đang tạo một đối tượng mới từ lược đồ, thiết lập các tham số, và sau đó lưu nó.

Sau đó, bạn cũng cần phải thay đổi như thế này:

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

Đây là một cái móc, được gọi là mỗi lần trước khi người dùng được lưu.

+0

Tôi sẽ đặt móc vào tập tin nào? –

+0

Giản đồ của bạn. user.js trong trường hợp của bạn. Nó có lẽ là UserSchema.pre thay vì User.pre bằng cách này. –

+0

Tôi đã tìm ra một cách khác để làm cho nó hoạt động, điều đó đơn giản hơn rất nhiều, cảm ơn bạn đã cố giúp đỡ. Tôi chỉ cần tạo người dùng mới trước khi gọi createUser thay vì làm tất cả cùng một lúc –

Các vấn đề liên quan