That Guy That Guy - 1 year ago 590
Node.js Question

.save() is not a Function Mongoose

I keep getting an issue that is not an issue. This is a mongoose function that I have used before. I required mongoose correctly and am unsure of why this error is occurring. Any help is welcomed.

The error I am getting is

TypeError: is not a function

My user.js inside the Models Folder

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

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){, hash, function(err, res) {
if(err) throw err;
callback(null, res);

My users.js inside the Routes Folder

//Mongoose Setup
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
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 }));

router.get('/register', function(req, res){
res.sendFile(appDir + "/views/register.html");
})'/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({
password: req.body.password,
info: req.body.user_bio
}, function(){
console.log('User Created');

module.exports = router;

Answer Source

createUser() is a regular function that you're passing a regular object (as the newUser argument) to:

  name :,
}, ...);

Regular objects don't have a .save method.

What you probably want is to create a static method as part of your model. That would allow you to call User.createUser like you are doing now (notice how static methods are created on the schema, not the model. Also, you have to define static methods before creating a model from the schema)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download