2016-07-19 3 views
1

私はnode.jsの初心者で、mongooseとフルスタックのWeb開発一般です。私は、データベースをセットアップしてサーバーと通信することに頭を悩ませています。私はこのチュートリアルにゆるやかに従いました:Easily Develop Node.js and MongoDB Apps with Mongoosenode.jsスクリプトでMongooseの.save関数が呼び出されていないようです。

とにかく、私のファイルはかなり簡単に整理されています。私のserver.jsは、 "testSchema.js"ファイルを含む "models"フォルダと同じディレクトリにあります。

server.jsファイルのボタンを押すと呼び出すことができるスクリプトがあります。

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
    }); 

}); 
mongoose.connection.close(); 

サンプルドキュメントをモデルに追加する必要があります。 そして最後に、testSchema.js:私は、スクリプトを実行したときに

var Schema = mongoose.Schema; 
var ItemSchema = new mongoose.Schema({ 
    name: { 
     type: String, 
     index: true 
    }, 
    score : Number 
}); 

var Item = mongoose.model('Item', ItemSchema); 

module.exports = Item; 

だから、私はメッセージを取得ではなく、メッセージ「作成されたアイテム」、また来る任意のエラーログ「我々は、接続されているの!」 .save関数が呼び出された後。これはちょっとスキップされているようですが、mongooseとnode.jsがどのようにこのコンテキストでふるまうかを知りません。 。セーブも呼ばれていますか?

さらに、私のmongoDBデータベースはOpenshiftでホストされていますが、私はlocalhostへのポート転送を行っていて、正常に動作しているようです。スクリプトを呼び出すたびに、「27017用の接続を処理する」というメッセージが表示されます。

ご協力いただければ幸いです!

**編集**

私の投稿を編集するだけです。

Zachary JacobiとRobert Klepの答えがトリックでした!どうもありがとう、私はノードがそれのような非同期であることを知らなかった。

+1

を 'open'イベントが発生する前にあなたが接続を閉じるしています。これは最終的にノードで非同期操作がどのように機能するか(次のコード行が実行されているときに操作がまだ完了していない可能性がある)と関係しています。 – robertklep

答えて

2

ノードがI/O上で非同期であるため、コード内に現れる順序でノードが必ずしも発生するとは限りません。

ここで、データベース接続が開かれ、ノードはコールバック内の残りのものが完了するのを待たずに次のステートメントに移動します。従ってはnewItem.save(function(err) {...より前に実際に実行されます。この問題を解決するには

、試してみてください。

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
     mongoose.connection.close(); 
    }); 

});