2015-07-14 3 views
0

Это мой user.jsNodeJS/Mongoose: exports.function и module.exports Несовместимость

var mongoose = require('mongoose'); 
    var bcrypt = require('bcrypt-nodejs'); 

    var UserSchema = mongoose.Schema({ 
     email: { 
      type: String, 
      unique: true 
     }, 
     password: String, 
    }); 

    var User = mongoose.model('User', UserSchema); 

    function createDefaultUsers() { 
     User.find({}).exec(function (err, collection) { 
      if (collection.length === 0) { 
       User.create({ 
        email: '[email protected]', 
        password: 'password0', 
       }); 
    } 

    exports.createDefaultUsers = createDefaultUsers; 
    module.exports = mongoose.model('User', UserSchema); 

Я называю createDefaultUsers в другом файле для создания начальных пользователей.

Но когда это дает мне следующую ошибку:

userModel.createDefaultUsers(); ^TypeError: Object function model(doc, fields, skipId) { if (!(this instanceof model)) return new model(doc, fields, skipId); Model.call(this, doc, fields, skipId); } has no method 'createDefaultUsers'

Но если я закомментировать module.exports = mongoose.model('User', UserSchema); компилирует нормально. Что я делаю неправильно.

Cheers.

+1

Я не понимаю, почему вы используете 'экспорт. createDefaultUsers = createDefaultUsers; '. Вы либо экспортируете модель, либо что-то еще, не то и другое, если вы не экспортируете объект, содержащий оба. –

+0

@KevinB Мне нужно экспортировать эту функцию для вызова из другого модуля во время инициализации. Лучший способ сделать это? – madu

+1

Вы можете прикрепить его к модели или схеме, см. Здесь: http://mongoosejs.com/docs/guide.html (методы экземпляра и статические методы) –

ответ

2

В этом случае вы должны прикрепить эту функцию как статический метод и экспортировать модель.

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt-nodejs'); 

var UserSchema = mongoose.Schema({ 
    email: { 
     type: String, 
     unique: true 
    }, 
    password: String, 
}); 

UserSchema.statics.createDefaultUsers = function createDefaultUsers(cb) { 
    return User.find({}).exec(function (err, collection) { 
     if (collection.length === 0) { 
      User.create({ 
       email: '[email protected]', 
       password: 'password0', 
      }, cb); 
     } else { 
      if (cb) { 
       cb(err, collection); 
      } 
     } 
    }); 
}; 

var User = mongoose.model('User', UserSchema); 
module.exports = User; 

Теперь вы можете использовать его непосредственно из модели (которая, вероятно, очень похоже на то, как вы уже используете его):

require('./models/user').createDefaultUsers();