Pergunta

Não posso fazer o mangusto trabalhar no meu aplicativo expresso.Eu instalei o mongoose e também o mongoose via NPM (a documentação do mongoose não afirma se o mongodb é necessário separadamente ou como colocá-lo em funcionamento).

Aqui está o código que estou usando.

    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!');
      }
    });

Alguém tem ideia do que estou fazendo de errado?Eu não entendo se preciso iniciar o mongodb separadamente ou não (parece que a função mongoose.connect inicia o servidor mongodb certo?)

Mas sim, nunca acontece nada quando eu inicio meu aplicativo (e ele deve estar exibindo o erro ou salvo! no meu console quando eu salvo a postagem de teste, certo?

De qualquer forma, qualquer ajuda seria muito apreciada!

Obrigado

Foi útil?

Solução

MongoDB é um serviço completamente separado e, portanto, já deve estar em execução para que o nodejs possa acessá-lo.

O motivo de você não estar vendo nenhuma saída é porque seu programa termina antes de sua postagem ser concluída ou, neste caso, expira porque não pode alcançar o MongoDB.

EDITAR

Se você ainda está curioso por que não viu nenhuma saída quando o MongoDB não estava em execução, pare o MongoDB e modifique seu aplicativo para incluir:

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

e execute-o novamente.

É fundamental perceber que o nodejs não é como a maioria dos ambientes de programação no sentido de que executa seu programa dentro de um loop de evento que só é executado enquanto tiver algo a fazer. Se não houver nada para fazer, o nodejs sairá.

E como seu post.save () inicia uma nova chamada assíncrona para MongoDB e retorna imediatamente , o aplicativo será encerrado imediatamente, já que não há mais nada a ser feito. (Nos bastidores, post.save () simplesmente adiciona um novo manipulador de eventos ao loop de eventos que observa a chamada ser concluída.)

Para garantir que seu programa não seja encerrado imediatamente, adicionamos process.stdin.resume(), que instrui o loop de evento a verificar se há novas entradas (da entrada padrão) em cada passagem, efetivamente fazendo seu programa funcionar para sempre.

Os servidores de rede baseados em Nodejs contam com o mesmo mecanismo para funcionar continuamente, observando a entrada de um soquete de rede em vez da entrada padrão.

Não consigo enfatizar o suficiente como o conceito de loop de evento é crucial para a programação em nodejs. Eu estimaria que 75% ou mais dos problemas que as pessoas relatam para conseguir que nodejs fizessem o que precisam podem ser atribuídos à não compreensão do loop de eventos e como isso afeta o modelo de programação de nodejs!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top