Bluebird Promise with Swagger:return 不是函数

Bluebird Promise with Swagger: return is not a function

我正在使用 Swagger 创建我的 JS API 客户端来调用一组 REST 端点。我正在配置 Swagger 客户端以使用 Promises (new Swagger({ spec: spec, usePromise: true })).

I require Bluebird 在 Swagger 之前,使用 Bluebird promises。但是我的应用程序在尝试使用 Promise.return.

时崩溃了

代码看起来像

client.user.get_db_user(db).return("foo");

其中客户端是 Swagger 引用。

我得到的错误是

app: TypeError: client.user.get_db_user(...).return is not a function

如果我用 then(() => value) 替换 return 就可以了。对于 then.

的这种用法,return 应该是 shorthand

经过调查,我发现它未能兑现 Swagger 客户端返回的承诺。

发生什么事了?

事实证明,Swagger 在幕后显式地使用了 Q promise 库。

Bluebird 和 Q 部分兼容,所以很多东西都可以正常工作。尝试使用 Q 没有的部分 Bluebird API 时会出现问题。

特别是,Bluebird 有 "return",而 Q 没有。

最简单的答案是使用问题中讨论的 then 结构。

我尚未尝试的其他可能的解决方案:

  1. 使用 "bluebird-q" 项目将 Q 替换为 Bluebird。
  2. promisifyAll Swagger 而不是使用 Swagger 的 built-in promise 支持。

您似乎无法告诉 Swagger 使用 Bluebird 承诺。但是,在您想要使用 Bluebird 方法的特定位置,您可以 "cast" Swagger 承诺到 Bluebird 承诺,然后使用 Bluebird 的功能。要转换这样的承诺,您只需将其包装在 Promise.resolve():

const Promise = require('bluebird');

Promise.resolve(client.user.get_db_user(db)).return(...)

虽然在这种特定情况下,由于 .return() 只是为了节省您的一些输入,但在您将之前的承诺包装在 Promise.resolve() 之后,它并不是真正的净节省。但是,对于像 .map() 或类似的更有意义的方法,它可能更有用。