如何在快递应用程序中使用承诺?
Posted
技术标签:
【中文标题】如何在快递应用程序中使用承诺?【英文标题】:How to use promises inside express app? 【发布时间】:2013-11-29 23:17:25 【问题描述】:我正在尝试在 app.get 函数中使用一个 Promise,该函数将运行一个查询,该查询将在一个 Promise 上运行。但问题是响应不等待承诺,而只是响应。
知道代码应该如何让promise 存在于app.get 中吗?
【问题讨论】:
你能告诉我们你正在使用的代码吗?没有它,我们无法为您提供准确的答案。 如果您愿意使用尚未从 Express 的关注中受益,但明确为 Promise 设计的东西,您可以考虑研究:HTTP Apps with Q-IO github.com/kriskowal/q-io, Q-IO 上的薄层称为 Joey github.com/montagejs/joey 或 Bogart github.com/nrstott/bogart,所有这些都使用 Q 并且基于 CommonJS/JSGI + promises + promise 流。 谢谢大家,看来这些承诺确实适用于 vanilla express,但不适用于 parse.com 上运行的版本......所以我所做的是将逻辑移出 parse.com 云代码和进入 Windows azure 实例。从长远来看,我认为这对我们来说比转发他们的发行版更好 【参考方案1】:app.get('/test', function (req, res)
db.getData()
.then(function (data)
res.setHeader('Content-Type', 'text/plain');
res.end(data);
)
.catch(function (e)
res.status(500,
error: e
);
);
);
【讨论】:
你是否也将连接调用包装在一个承诺中......即,db.connectAsync(stuff;).then(function (dbh) app.get('/test', ...) );
如果您在数据库连接承诺中拥有所有应用程序处理程序,该承诺会返回任何内容吗?【参考方案2】:
这是Express documentation的回答:
app.get('/', function (req, res, next)
// do some sync stuff
queryDb()
.then(function (data)
// handle data
return makeCsv(data)
)
.then(function (csv)
// handle csv
)
.catch(next)
)
app.use(function (err, req, res, next)
// handle error
)
值得注意的主要是通过.catch()
传递next
,这样一个通用的错误处理路由可以将错误处理逻辑封装到下游。
【讨论】:
以上是关于如何在快递应用程序中使用承诺?的主要内容,如果未能解决你的问题,请参考以下文章