我不能让我的生活在我的快递应用程序中得到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服务器吧?)
但是,当我启动我的应用程序时,没有任何事情发生(当我保存测试帖时,它应该输出错误或保存到我的控制台?
无论如何,任何帮助将非常感谢!
谢谢
最佳答案 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编程模型!