我正在使用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');
答案 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 确实已保存。