如何使用 Bluebird 承诺 NodeJS Express
Posted
技术标签:
【中文标题】如何使用 Bluebird 承诺 NodeJS Express【英文标题】:How to promisify NodeJS Express with Bluebird 【发布时间】:2014-09-07 20:59:14 【问题描述】:我将 NodeJS 与 Express 一起使用,并使用 Bluebird 进行承诺。我正在尝试如下承诺 app 对象,但一旦承诺的函数总是抛出错误。部分代码如下:
var express = require('express'),
app = express(),
bodyParser = require('body-parser'),
Promise = require("bluebird");
app.postAsync = Promise.promisify(app.post);
app.postAsync('/api/v1/users/update').then(function(req, res, next)
// never gets here
)
.catch(function(err)
console.log("doh!!!");
);
我尝试以同样的效果 promisifyAll。为什么它会失败,有什么方法可以承诺发布/获取?
【问题讨论】:
你知道你传递给app.post
的回调应该做什么,什么时候被调用,以及使用什么参数?你不能在这里使用 Promises!
@Bergi 你说得对,我是个白痴。哎呀。这只是路由服务器端,我什至不知道为什么我认为他试图在这里发起请求。
【参考方案1】:
你真的不想这样做。 Promise 是 错误的抽象。
承诺代表一个最终操作的结果。一个承诺只能改变它的状态一次,所以即使你设法正确地承诺app.post
,它也只能为一个客户服务一次。
Promises 是一个很棒的抽象——但这绝对不是 Promise 旨在解决的问题。相反,如果您对 with 承诺的有趣抽象感兴趣,您可以检查 kriskowal(Q 作者)的 Q-IO 或您返回承诺以响应但处理程序本身被多次调用的承诺路由器之一.
这一点我怎么强调都不为过——promise 是一个很棒的抽象,但它们并没有解决或试图解决你所有的并发问题。
【讨论】:
以上是关于如何使用 Bluebird 承诺 NodeJS Express的主要内容,如果未能解决你的问题,请参考以下文章
一个承诺的 mysql 模块将如何与 NodeJS 一起工作?
如何使用 Bluebird 在构造函数构建的“类”上承诺导出的函数
如何使用 Bluebird 承诺 Node 的 child_process.exec 和 child_process.execFile 函数?