首页 文章

表达app nodejs和mongoose db / mongodb入门

提问于
浏览
4

我不能让我的生活在我的快递应用中得到猫鼬 . 我已经通过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 回答

  • 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的网络服务器依靠相同的机制连续运行,从网络套接字而不是标准输入中观察输入 .

    I cannot stress enough how crucial the event-loop concept is to programming in nodejs. I would estimate that 75% or more of the problems people report getting nodejs to do what they need can be attributed to not understanding the event loop and how it affects the nodejs programming model!

相关问题