4

私はここでstackoverflowで見つけた簡単なマングース/ノードの例を実行しようとしています:

var mongoose = require('mongoose'),
db = mongoose.connect('mongodb://localhost/db'),
Schema = mongoose.Schema;

var sentinel = setTimeout(function(){
    throw "failed to connect to MongoDB after one minute!";
}, 60*1000); // 60 seconds


mongoose.model('User', new Schema({
    properties: {
        name    : { type: String, index: true }
    }
}));    

var User = db.model('User');

var u = new User();
u.name = 'Foo';
u.save();

User.find().all(function(arr) {
    clearTimeout(sentinel); // cancel the timeout sentinel
    console.log('Users found');
    console.log(arr);
    console.log('length='+arr.length);
});

process.stdin.resume();

コードを正しく取得すると、スクリプトの最後にあるターミナルに出力が表示され、「ユーザーが見つかりました」というメッセージとコレクションのすべてのユーザーが出力されます。しかし、タイムアウトメッセージが表示されます。どうして?

サーバーをAmazonEC2マイクロインスタンスで実行しています。Node、Mongodb、mongooseがインストールされ、Mongodbサーバーが実行されています(ターミナルから「mongo」を介して対話できます)。また、ディレクトリ/ data/dbを作成しました。

4

2 に答える 2

4

マングースについてはわかりませんがu.save()、DBに書き込むため、非同期である可能性があります。試す

u.save(function (err){
    if(err) console.log(err);
    User.find().all(function(arr) {
        clearTimeout(sentinel); // cancel the timeout sentinel
        console.log('Users found');
        console.log(arr);
        console.log('length='+arr.length);
    });
});

編集:これは正常に機能します

var mongoose = require('mongoose');
var connection = mongoose.connect('mongodb://localhost/my_database');

var Schema = mongoose.Schema
var User = new Schema({
    author    : String
  , type      : String
});

var MyUserModel = mongoose.model('User', User); //create and access the model User

var u = new MyUserModel();
u.author = 'authorname';
u.save(function(err){
    if (err) console.log(err);
});

MyUserModel.find({}, function (err,docs) {
    console.log(docs);
});
于 2012-07-05T11:14:35.357 に答える
0

DBを使用する各ルーターに1つのステップを追加することで、この問題を処理しました。

少し面倒ですが、動作し、100%リークはありません。

このようなもの:

// file: 'routes/api/v0/users.js'
router
var User = require('../../../models/user').User,
    rest = require('../../../controllers/api/v0/rest')(User),
    checkDB = require('../../../middleware/checkDB');

module.exports = function (app) {
  app.get('/api/v0/users', checkDB, rest.get);
  app.get('/api/v0/users/:id', checkDB, rest.getById);
  app.post('/api/v0/users', checkDB, rest.post);
  app.delete('/api/v0/users', checkDB, rest.deleteById);
  app.put('/api/v0/users', checkDB, rest.putById);
};

// file: 'middleware/checkDB.js'
var HttpError = require('../error').HttpError,
    mongoose = require('../lib/mongoose');

// method which checks is DB ready for work or not
module.exports = function(req, res, next) {
  if (mongoose.connection.readyState !== 1) {
    return next(new HttpError(500, "DataBase disconnected"));
  }
  next();
};

PS解決策をもっとよく知っているなら、私に知らせてください。

于 2013-11-18T09:43:13.397 に答える