开始使用express应用程序、Node.js和Mongoose数据库/MongoDB

4

我无论如何都无法让mongoose在我的express应用程序中工作。我已经通过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服务器,对吗?)

但是,当我启动我的应用程序时,什么也没有发生(当我保存测试帖子时,它应该将错误或已保存!输出到控制台,对吗?

总之,任何帮助都将非常感激!

谢谢


这里有一个演示供您开始使用:http://goo.gl/HlbXE - Madhusudhan
1个回答

2

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

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


你确定吗?因为我刚刚添加了以下内容:var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1/my_database'); console.log(mongoose.connection.host); console.log(mongoose.connection.port); -- 并且它显示已连接到端口27017上的mongodb -- 如果我必须启动它(如果没有启动,我认为它不会连接到mongo),那么我如何在本地为我的express应用程序启动它? - thrice801
我确定。你确定MongoDB没有在运行吗?另外,打印主机和端口并不能保证连接已经建立。 - Rob Raisch
你的代码最大的问题是nodejs在post请求异步执行时可能在post请求完成前就已经结束了。 - Rob Raisch
谢谢你的帮助,你的第一个答案是正确的。我没有运行它。我必须在我的项目中执行mkdir -p /data/db,然后使用mongod启动它,然后它就可以工作了! - thrice801

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接