有什么办法可以在NodeJS中没有callback的情况下执行命令

我想连接MongoDB并find一些文件。

事实是,我将在所有模块中使用这个客户端( mongo )。 这意味着它是共享的

我做了一个模块,并build立了一个connect()函数。 我也find(params)函数。 当我在类之外执行connect()然后find()find()在mongo连接到db之前被执行。 这是因为NodeJS的本质。 意味着async

但是,我怎么能等待连接build立,然后执行我的查询?

Python有asyncio,但我仍然可以连接,然后执行我的查询没有callback…我使用NodeJS只是因为SocketIO,但现在我真的想如果即时通讯selectNodeJS和切换到Python做错了。 任何人都可以给我一些东西,我可以写更好的代码? 任何文件阅读? 或者这种情况下有什么窍门?

比如我查询数据库(postgresql),这个查询返回一个数据。 我必须处理这些数据,但是我不能按顺序做。 我再次使用callback。 如果我遵循NodeJS规则,它看起来像callback in a callback in a callback in a callback.....就像这样。 更基本的说,可以说一个请求已经对NodeJS,我不得不查询3个不同的SQL文本。 他们每个人都依赖于之前。 我必须在每个callback中实现3个查询和callback。

我明白这个错误吗? 自从7个小时以后,我就开始疯狂起来。

我喜欢asynchronousfunction。 真。 但是我应该怎么处理这种情况呢?

有几个技术可以减less水平延伸的callback。

asynchronous

 async.series([ function(callback) { ... }, function(callback) { ... } ]); 

许诺

 doStuff .then(function() { ... }) .then(function() { ... }) 

手动逻辑中断

 doStuff(function(err, callback) { if (err) return callback(err); ... callback(null, nextThing); }); function nextThing(err, callback) { ... } 

具体到你的db驱动混淆,我想你应该有这样的代码结构:

 var mydb; client.connect('mydb', function(err, db)) { mydb = db; httpserver.listen(); } // ... function restMethod(request, response) { mydb.query(..., function(err, result) { ... } } 

即连接对象,HTTP路由等都应该存储在模块级variables或其他对象中,而不是让整个应用程序依赖callback参数。

还有一个npm同步模块。 用于同步执行查询的过程。

当你想以同步的方式运行并行查询时,节点限制就这么做,因为它永远不会等待响应。 同步模块对于这种解决scheme来说是非常完美的。

示例代码

 /*require sync module*/ var Sync = require('sync'); app.get('/',function(req,res,next){ story.find().exec(function(err,data){ var sync_function_data = find_user.sync(null, {name: "sanjeev"}); res.send({story:data,user:sync_function_data}); }); }); /*****sync function defined here *******/ function find_user(req_json, callback) { process.nextTick(function () { users.find(req_json,function (err,data) { if (!err) { callback(null, data); } else { callback(null, err); } }); }); } 

参考链接: https : //www.npmjs.com/package/sync