如何解决表示应用程序nodejs和mongoose db / mongodb入门
|| 我无法终生让猫鼬在我的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,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()
,该值指示事件循环在每次通过时检查新输入(来自标准输入),从而有效地使程序永久运行。
基于Node.js的网络服务器依靠相同的机制连续运行,监视来自网络套接字的输入,而不是标准输入。
我无法强调事件循环概念对于在nodejs中进行编程至关重要。我估计,人们报告说有75%或更多的问题使他们无法执行Nodejs,这可以归因于不了解事件循环及其对Nodejs编程模型的影响!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。