Expressアプリnodejsとmongoosedb / mongodbが開始
質問
私は私の人生のために、私のエクスプレスアプリでマングースを働かせることはできません。 iveは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サーバーを起動するように見えますか?)
しかし、YA、アプリを起動したときに何も起こりません(そして、エラーを出力するか、保存してください!テスト投稿を保存するとコンソールになりますか?
とにかく、どんな助けも大歓迎です!
ありがとう
解決
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でのプログラミングにとってどれほど重要であるかを十分に強調することはできません。私は、人々が必要なことを行うようにnodejを取得すると報告する問題の75%以上が、イベントループを理解しないことと、それがNodejsプログラミングモデルにどのように影響するかを理解することができると推定します。