在脚本中阻止节点

时间:2015-09-08 07:41:46

标签: javascript node.js mongodb asynchronous mongoose

我正在使用Node.js编写在服务器上运行的系统脚本。由于Node的异步性质,我的脚本在数据库调用有机会完成之前退出,并且没有任何内容写入数据库。

我正在使用Mongoose作为ORM并与MongoDB交谈,如果这有任何区别的话。由于这个原因,Node.js提供了SYNCHRONOUS方法调用,例如:https://nodejs.org/api/child_process.html

我想我的问题是:

1)mongoose是否提供了一种阻止方式,以便我的脚本编写过程可以等待数据库调用返回?

2)如果没有,除了类似的东西之外,还有其他方法吗?

(function wait () {
   if (!SOME_EXIT_CONDITION) setTimeout(wait, 1000);
})();

3)节点不是编写脚本作业的最佳工具吗?我喜欢用于Web应用程序开发的节点,并且可以编写嵌套回调或整天使用promises。但是作为一种脚本语言呢?

EDIT ---------------------------------------------- -

以下是提供更清晰情况的脚本的快速示例:

#!/usr/bin/env node
# Please note the above that this is a bash script

var schema = mongoose.Schema({
   // ... attributes ...
});
var model = new (mongoose.model('ModelObject'))();

model['attribute'] = 42;

console.log('This gets printed first');
model.save(function(err) {
  console.log('Nothing in the callback gets printed because callback is never called');
  if(err) { // Can't check for errors because this is never reached
    console.log('This never gets printed to the screen');
    console.log('And consequently nothing is ever saved to mongo');
  } else {
    console.log('This never gets printed either');
  }
});
console.log('This gets printed second');

3 个答案:

答案 0 :(得分:1)

如果您的模型未保存,则会出现Mongo错误。遵循MongoDB约定,您必须检查错误:

model.save(function(error, savedItem) {
  if(error) {
    // nothing is saved
  }
});

否则,你考虑过使用Promises吗?它对链接事件和更简单的错误处理很有用。

Promise = require('bluebird');
Promise.promisifyAll(mongoose.Query.base);

model.saveAsync().then(function(savedItem) {
  // saved
})
.catch(function(error) {
  // handle error
});

答案 1 :(得分:0)

我认为你正在寻找这个,如果这对你有所帮助,请查看下面的内容。

var mongoose = require('mongoose'),
    model1 = mongoose.model('model1'),
    model2 = mongoose.model('model2');

model1.findOne({"type" : 'Active'}, function err(err, catConfig) {
    if(!err.error){
        //This will execute once above DB call is done!
        model2.findOne(condition).remove(function(err, gAnalysis) {
                //Lines of code that you want to execute after second DB call 
        });
    }
});

答案 2 :(得分:0)

我没有看到你打开与数据库的连接,所以假设保存模型实例什么都不做,甚至没有用错误调用回调......

我测试了以下示例:

<强> test.js

var mongoose = require('mongoose');

var kittySchema = mongoose.Schema({
  name: String
});

var Kitten = mongoose.model('Kitten', kittySchema);

mongoose.connect('mongodb://localhost:27017/test', function (err) {
  if (err) throw err;

  var silence = new Kitten({ name: 'Silence' });
  silence.save(function (err, saved) {
    if (err) throw err;

    console.log('Kitty Silence is saved!');

    mongoose.disconnect(function (err) {
      if (err) throw err;

      console.log('done...');
    });
  });
});

正在运行node test.js将其打印到控制台:

Kitty Silence is saved!
done...

并检查我的本地测试数据库显示 Silence 确实已保存。