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();

如果我得到正确的代码,脚本末尾的终端应该会输出一个输出,其中应该打印“找到用户”消息和集合中的所有用户。但我只是收到超时消息。为什么?

我在 Amazon EC2 微型实例上运行我的服务器。Node、Mongodb 和 mongoose 已安装并且 Mongodb 服务器正在运行(我可以通过“mongo”从终端与它交互)。我还创建了目录 /data/db。

4

2 回答 2

4

我不知道猫鼬,但u.save()可能是异步的,因为它写入数据库。尝试

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 的每个路由器中添加一个额外的步骤来解决这个问题。

它有点乱,但它可以工作并且 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 回答