【问题标题】:express app nodejs and mongoose db / mongodb getting startedexpress app nodejs 和 mongoose db / mongodb 入门
【发布时间】:2011-09-14 03:38:51
【问题描述】:

我一辈子都无法让 mongoose 在我的 express 应用中工作。我已经安装了 mongoose,还通过 NPM 安装了 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 服务器对吗?)

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

任何帮助将不胜感激!

谢谢

【问题讨论】:

标签: mongodb node.js express mongoose


【解决方案1】:

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 编程的重要性都不过分。我估计人们报告让 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 应用程序启动它?
  • 我确定。你确定 MongoDB 没有运行吗?打印出主机和端口也不能保证连接已经建立。
  • 你的代码最大的问题是nodejs在你的帖子有机会完成之前就结束了,因为帖子是异步执行的。
  • 非常感谢您的帮助,您的第一个答案是正确的,但没有运行。我必须在我的项目中执行 mkdir -p /data/db 然后 mongod 启动它,然后它就起作用了!
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2019-01-18
  • 2017-01-22
  • 2020-06-28
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多