表达app nodejs和mongoose db / mongodb入门

时间:2011-06-13 18:41:58

标签: mongodb node.js express mongoose

我不能让我的生活在我的快递应用中得到mongoose。我已经通过NPM安装了mongoose和mongodb(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服务器吧?)

但是,当我启动我的应用程序时,没有任何事情发生(当我保存测试帖时,它应该输出错误或保存到我的控制台?

无论如何,非常感谢任何帮助!

由于

1 个答案:

答案 0 :(得分:2)

MongoDB是一个完全独立的服务,因此必须已经运行nodejs才能访问它。

您没有看到任何输出的原因是因为您的程序在您的帖子完成之前结束,或者在这种情况下超时,因为它无法到达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编程模型!