1

将两个模型添加到数据库后,有人可以帮我关闭数据库吗?我试过阅读

http://howtonode.org/intro-to-jake

Node.js 和 Jake - 如何在任务中同步调用系统命令?

以及 https://github.com/mde/jake上的 github 自述文件

但似乎仍然无法弄清楚。这是自述文件的摘录

所有任务运行后的清理,jake 'complete' 事件 基本的 'jake' 对象是一个 EventEmitter,并在运行所有任务后触发一个 'complete' 事件。当任务启动一个保持节点事件循环运行的进程(例如,数据库连接)时,这有时很有用。如果您知道要在所有任务完成后停止正在运行的 Node 进程,您可以为“完成”事件设置一个侦听器,如下所示:

jake.addListener('complete', function () {
  process.exit();
});

就像现在一样,它甚至在打开连接之前就关闭了连接。

// db connect
var db = require('./schema');

desc('Seed MongoDB with initial data');
task('seed', [], function () {

    //******* Populate the database
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user1.email +' saved');
        }
    });
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user2.email +' saved');
        }
    });

    db.mongoose.connection.close();
    console.log('Closed mongodb connection');
});

编辑: 我能够使用 parseq 模块中的并行流来完成我的目标。

par(
  function() {
    fs.readFile("file1", this);
  },
function() {
  fs.readFile("file2", this);
},
function done(err, results) {
  ...
}
);

Edit2: 所以我真的很感谢所有的帮助。我还看到你是 parseq 的维护者 :)。谢谢!我仍在为最后一点苦苦挣扎,当函数 5 完成时,我的函数挂起并且没有调用 done()。我确定我错误地调用了“this”。有什么建议吗?

seq(
    function f1() {
        var user = new db.userModel({ email: 'x'
                        , password: 'x'
                        , phone: x });
        user.save(this);
    }, 
    function f2(err, value) {
        var user = new db.userModel({ email: 'x'
                        , password: 'x'
                        , phone: x });
        user.save(this);
    }, 
    function f3(err, value) {
        var merchant = new db.merchantModel({ name: 'x'
                        , logourl: 'x' });
        merchant.save(this);
    }, 
    function f4(err, value) {
        var merchant = new db.merchantModel({ name: 'x'
                        , logourl: 'x' });
        merchant.save(this);
    }, 
    function f5(err, value) {
        db.merchantModel.findOne({ name: 'x' }, function(err, merchant) {
            var coupon = new db.couponModel({ merchant_id: merchant.id
                            , name: 'x'
                            , imageurl: 'x'
                            , expiration: Date.UTC(2013,3,15) });
                            //, expiration: new Date(2013,3,15) }); //alternate date creation method
            coupon.save(this);
        });
    }, 
    function done(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('successfully seeded db');
        }
        db.mongoose.connection.close();
        console.log('Closed mongodb connection');
    }
);
4

1 回答 1

1

您需要db.mongoose.connection.close在两个保存功能完成后调用。最简单的方法是嵌套保存调用(但不是最漂亮的)。

var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
user1.save(function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log('user: '+user1.email +' saved');
    }
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user2.email +' saved');
        }
        db.mongoose.connection.close();
        console.log('Closed mongodb connection');
    });
});

然后您应该开始研究流控制库以使您的代码更简单。

使用 parseq 做同样的事情:

var seq = require("parseq").seq;

seq(
  function f1() {
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(this);
  }, function f2(err, value) {
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(this);
  }, function done(err) {
    // check err here
    console.log('Closed mongodb connection');
  }
);

有选择地忽略一些错误,下面是一个函数的样子:

function f1() {
    var self = this;
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(function(err) {
      if (err === SOMETHING_TO_IGNORE) {
        self(null);
      else {
        self(err);
      }
    });
  }
于 2013-02-05T22:43:46.213 回答