2015-06-05 3 views
1

Я пытаюсь использовать mongoose для контроля логики и транзакций db. У меня уже есть определения Схемы, и я экспортирую модели.Как правильно использовать модели Mongoose с Node.js?

Howver, когда я пытаюсь использовать модель, она не будет выполнена WITL сообщения вроде:

return mongoose.model('Report', reportSchema); } has no method 'find' ...

Это мой экспорт Модели:

module.exports = (function() { 

var mongoose = require('mongoose'), 
Schema = mongoose.Schema, 
ObjectId = Schema.ObjectId; 

    var reportSchema = mongoose.Schema({ 

     category: ObjectId, 
     authorName: String, 
     authorEmail: String, 
     text: String, 
     address: String, 
     coordinates: { 
      type: "Point", 
      coordinates: [Number,Number] 
     }, 
     date: { 
      type: Date, 
      default: new Date() 
     }, 

     comments: Array 
    }); 

    return mongoose.model('Report', reportSchema); 
}); 

И вот как мои функции контроллера кодируются с использованием мангуста внутри:

module.exports = (function() { 

    var mongoose = require('mongoose'); 
    var Report = require('../models/Report'); 
    var Category = require('../models/Category'); 

    function _getReports (request,response,next) { 

     var take = request.query.take; 
     var skip = request.query.skip; 

     Report.find({}).limit(take).skip(skip).exec(function (err,reports) { 

      callback(err,reports,response); 
     }); 
    } 

    function _getReport (request,response,next) { 

     var id = request.params.id; 

     Report.findById({_id: id}, function (err,report) { 

      callback(err,report); 
     }); 
    } 

    function _createReport (request,response) { 

     var newReport = new Report(); 

     newReport.text = request.body.text; 
     newReport.category = request.body.category; 
     newReport.author = request.session.userId; 

     newReport.save(function (err,savedReport) { 
      callback(err,savedReport._id,response); 
     }); 

    } 

    function _updateReport (request,response) { 

     var id = request.params.id; 
     var update = request.body.report; 

     Report.findByIdAndUpdate(id, update, function (err,foundReport) { 

      callback(err,foundReport,response); 
     }); 
    } 

    function _deleteReport (request,response) { 

     var id = request.params.id; 

     Report.findByIdAndRemove(id, function (err,foundReport) { 
      callback(err,foundReport,response); 
     }); 
    } 

    function _getReports (request,response,next) { 

     var take = request.query.take; 
     var skip = request.query.skip; 

     Report.find({}).limit(take).skip(skip).exec(function (err,reports){ 

      callback(err,reports,response); 
     }); 
    } 

    function _getCategories (request,response) { 

     var take = request.query.take; 
     var skip = request.query.skip; 

     Report.find({}).limit(take).skip(skip).exec(function (err,reports) { 

      callback(err,reports,response); 
     }); 
    } 

    function _getCategoryReports (argument) { 

     var _id = mongoose.Types.ObjectId(request.params.id); 

     Report.find({category:id},{category:false},function (err, foundReports) { 
      callback(err,foundReports,response); 
     }); 
    } 

    function _createCategory (request,response) { 

     var newCategory = new Category(); 

     newCategory.name = request.body.name; 

     newCategory.save(function (err,savedCategory) { 
      callback(err,savedCategory._id,response); 
     }); 
    } 

    function _updateCategory (request,response) { 

     var id = request.params.id; 
     var update = request.body.category; 

     Category.findByIdAndUpdate(id, update, function (err,foundCategory) { 

      callback(err,foundCategory,response); 
     }); 
    } 

    function _deleteCategory (request,response) { 

     var id = request.params.id; 

     Category.findByIdAndRemove(id, function (err,foundCategory) { 
      callback(err,foundCategory,response); 
     }); 
    } 



    function callback (err,object,response) { 

      if (err) 
       response.status(500).send(JSON.stringify(err)); 

      response.send(JSON.stringify(object)); 
    } 


    var apiController = { 
     getReports: _getReports, 
     getReport: _getReport, 
     createReport: _createReport, 
     updateReport: _updateReport, 
     deleteReport: _deleteReport, 
     getCategories: _getCategories, 
     getCategoryReports: _getCategoryReports, 
     createCategory: _createCategory, 
     updateCategory: _updateCategory 
    } 

    return apiController; 
})(); 

До этого соединение мангуст обеспечивается:

var connectToMongoose = function (mongoose,app) { 

    var connect = function() { 
     var options = { server: { socketOptions: { keepAlive: 1 } } }; 
     mongoose.connect('mongodb://localhost/data4', options); 
    } 


    mongoose.connection.on('connected', function() { 

     console.log('Connected to db'); 

     app.listen(32884, function() { 
      console.log("Listening at \"data4 port\" @:32884"); 
     }); 
    }) 

    mongoose.connection.on('error', function (err) { 
     console.log(err); 
    }); 

    mongoose.connection.on('disconnected', function() { 
     console.log('Disconnected from db, attempting to connect again...'); 
     app.close(); 
     connect(); 
    }); 

    connect(); 
}; 

module.exports = connectToMongoose; 

Который вызывается require('./db/mongoose-connect.js')(mongoose,app);

Что я делаю неправильно?

ответ

1

Здесь есть пара вопросов, которые я поймал с места в карьер.

Во-первых, я не вижу строку mongoose.connect(), которая явно связывает ваш Mongoose ODM с сервером mongo + database. Примером может служить:

var mongoose = require('mongoose'), 
Schema =  mongo.Schema, 
ObjectId =  mongo.Schema.ObjectId; 

mongoose.connect('mongodb://localhost/db_name'); 

Ваш экспорт схемы выглядит хорошо. Но вы используете анонимную функцию как ваш экспорт. Так как вы делаете это, ваше require заявление необходимо немного изменить:

var Report = require('../models/Report')(); 
var Category = require('../models/Category')(); 

Обратите внимание на () в конце заявления требуют. Вам необходимо выполнить функцию, которую вы определяете как module.export файла модели.

EDIT: Я вижу, что вы добавили свой код подключения к мангусте. На этом этапе выполнение функции module.exports, которую вы назначаете в файле модели, должно позволить вашим моделям mongoose функционировать по назначению.

0

При экспорте функции;

// file: A.js 
module.exports = function() { 
    //some logic 
}; 

И вы хотите использовать его на другой файл, когда вам требуется файл A, вы импортируете функцию и для того, чтобы использовать эту функцию, необходимо ссылаться на него.

// file: B.js 
var A = require('./A.js'); 
A(); 

так что ваша модель экспортирует функцию

module.exports = (function() { 

    var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 

    // .. 
    // some code 
    // .. 

    return mongoose.model('Report', reportSchema); 
}); 

и при импорте вашей модели из контроллера, вам необходимо выполнить импортированную функцию, чтобы ваш Report переменная содержит модель, созданную :

 
    module.exports = (function() { 

     var mongoose = require('mongoose'); 
     var Report = require('../models/Report')(); 

Я создал суть, как вы могли написать свой код с использованием модулей без использования IIFE. https://gist.github.com/wilsonbalderrama/d5484f3f530899f101dc на самом деле, если вы загружаете все эти файлы на папку и запустите:

$ sudo npm install 
$ mocha 

Вы могли видеть, что все тесты, созданные для контроллера проезжают.


Кроме того, вы не должны использовать IIFE в Node.js с тех пор, когда вы создаете модуль, потому что у вас уже есть изолированная область в Node.js с использованием модулей.

// IIFE 
module.exports = (function() { 

var apiController = { 
    getReport: function() {} 
} 

    return apiController; 
})(); 

В Node.js вы можете экспортировать объект,

// GOOD WAY 
module.exports = { 
    getReport: function() {} 
}; 
Смежные вопросы