2013-05-31 2 views
0

У меня есть странная проблема с Node.js, где каталоги node_module, кажется, мешают друг другу. У меня есть следующая структура файла:Node.js node_modules, мешающие друг другу

- node_modules 
- User.js 
- app 
    - app.js 
    - node_modules 

Так что я node_modules в каталоге верхнего уровня, а также один внутри каталога приложений. Каждый каталог node_modules содержит только каталог mongoose. Файл user.js простой мангуст модель:

exports.User = function() { 
    var mongoose = require('mongoose'); 
    var Schema = mongoose.Schema; 

    var UserSchema = new Schema({ 
     email:  { type: String }, 
     firstName: { type: String }, 
     lastName: { type: String }, 
    }); 

    mongoose.model("User", UserSchema); 
    var User = mongoose.model("User"); 
    return User; 
}(); 

Основное приложение, app.js, выглядит следующим образом:

var mongoose = require("mongoose"); 
mongoose.connect("mongodb://localhost:27017/crnapi"); 
require("../User").User.find(function(err, users) { 
    if(err) 
     console.log(err); 

    console.log("here"); 
}); 

Ничего, кроме подключения к Монго и найти пользователя. Проблема, которую я вижу, заключается в том, что вызов find() просто зависает - обратный вызов никогда не вызывается.

Однако, если я удалю внутренний каталог node_modules (тот, который находится внутри папки приложения), он отлично работает. Это похоже на присутствие внутренних узлов_модулей, которые каким-то образом закручивают работу мангуста. Я знаю, что могу поместить все в внешние node_modules и просто удалить внутреннюю, но есть причины, почему я этого не делаю.

Может ли кто-нибудь сказать мне, что здесь происходит? Есть ли режим отладки, в котором я могу запускать узел или мангуст, который скажет мне, что он повесил трубку?

+0

Что-то мне пришло в голову. Возможно ли создание и использование двух отдельных экземпляров мангуста? В app.js можно использовать один из внутренних узлов node_modules, а User.js будет использовать один из внешних узлов node_modules. Может быть, у меня есть два отдельных подключения к mongodb? – d512

+2

Вы правы, вы получите два отдельных экземпляра Mongoose. Тот, который ваша загрузка в ваш модуль «User.js», вероятно, никогда не получит соединение. Из-за этого запрос просто ставится в очередь (это поведение по умолчанию Mongoose). Если вы хотите удерживать текущую структуру (не знаете, зачем вам нужны два каталога node_modules), вы можете сделать модуль, который является единственным заданием, чтобы вернуть объект mongoose (и, возможно, также вызвать его на нем). –

+0

Прочтите http://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders, чтобы увидеть, как работает «именованный» модуль (т. Е. Не относительный путь). –

ответ

1

Проблема заключалась в том, что я создавал несколько экземпляров мангуста вместо создания единственного и использующего весь код. Я решил это, переместив модуль mongoose в достаточно высокий каталог, чтобы весь код, использующий mongoose, мог получить доступ к тому же самому.

Смежные вопросы