Вопрос

Я не могу на всю жизнь получить Mongoose работать в моем приложении Express. Я установил Mongoose, а также MongoDB через NPM (в документации Mongoose не указывалось, требовался ли MongoDB отдельно или как его запустить).

Вот код, который я использую.

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://127.0.0.1/my_database');

    var Schema = mongoose.Schema, ObjectId = Schema.ObjectId;

    var Comments = new Schema({
        title     : String
      , body      : String
      , date      : Date
    });

    var BlogPost = new Schema({
        author    : ObjectId
      , title     : String
      , body      : String
      , date      : Date
      , comments  : [Comments]
      , meta      : {
            votes : Number
          , favs  : Number
        }
    });

    var BlogPost = mongoose.model('BlogPost', BlogPost);
    var post = new BlogPost();
    post.title='blahblah';
    // create a comment
    post.comments.push({ title: 'My comment' });

    post.save(function (err) {
      if(err){
          throw err;
          console.log(err);
      }else{
          console.log('saved!');
      }
    });

У кого -нибудь есть идеи, что я делаю не так? Я не понимаю, нужно ли мне каким -то образом запустить Mongodb отдельно или нет (похоже, функция Mongoose.connect запускает сервер MongoDB правильно?)

Но да, ничего не происходит, когда я запускаю свое приложение (и оно должно выводить либо ошибку, либо сохранить! На мою консоли, когда я сохраняю тестовый пост, верно?

В любом случае, любая помощь будет очень оценена!

Спасибо

Это было полезно?

Решение

MongoDB - это совершенно отдельная услуга, и поэтому он уже должен работать для Nodejs, чтобы получить к нему доступ.

Причина, по которой вы не видите никакого вывода, заключается в том, что ваша программа заканчивается до завершения вашего поста, или, в данном случае, Times Out, потому что она не может достичь MongoDB.

РЕДАКТИРОВАТЬ

Если вам все еще любопытно, почему вы не видели никаких выводов, когда MongoDB не работает, остановите MongoDB, измените свое приложение, чтобы включить:

// exit program in one minute with an error
// cancelled if we can successfully talk to MongoDB
var sentinel = setTimeout(function(){
    throw "failed to connect to MongoDB after one minute!";
}, 60*1000); // 60 seconds

post.save(function (err) {

  clearTimeout(sentinel); // cancel the timeout sentinel

  if(err){
      throw err;
      console.log(err); // won't occur since the throw will end the program
  }else{
      console.log('saved!');
  }
});

process.stdin.resume();  // read from stdin to keep program running

и запустить его снова.

Очень важно понимать, что Nodejs не похожа на большинство средств программирования в том, что он запускает вашу программу в цикле событий, который работает только до тех пор, пока она есть чем заняться. Если нечего делать, Nodejs выйдет.

А так как ваш Post.Save () начинает новый асинхронный призыв к MongoDB и немедленно возвращается, Приложение немедленно выйдет, так как это больше нечего делать. (Под обложками Post.Save () просто добавляет нового обработчика событий в цикл событий, который смотрит на завершение вызова.)

Чтобы убедиться, что ваша программа не выйдет сразу же, мы добавляем process.stdin.resume() который инструктирует цикл событий проверить новый ввод (от стандартного ввода) на каждом проходе, эффективно заставляя вашу программу работать навсегда.

Сетевые серверы на основе Nodejs полагаются на тот же механизм для непрерывного запуска, наблюдая за вводом сетевого сокета вместо стандартного ввода.

Я не могу подчеркнуть, насколько важной является концепция событий для программирования в Nodejs. Я бы оценил, что 75% или более проблем, с которыми люди сообщают, что получают Nodejs, чтобы делать то, что им нужно, можно объяснить тем, что не понимают цикл событий и то, как он влияет на модель программирования Nodejs!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top