如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章

与 fs 和 bluebird 的承诺

一个承诺的 mysql 模块将如何与 NodeJS 一起工作?

如何使用 Bluebird 在构造函数构建的“类”上承诺导出的函数

如何使用 Bluebird 承诺 Node 的 child_process.exec 和 child_process.execFile 函数?

Nodejs - 将属性上的承诺数组解析为对象数组

像在 Q 中定义空的 Bluebird 承诺