带有Swagger的Bluebird Promise:return不是一个函数

时间:2017-01-22 22:42:30

标签: javascript promise swagger bluebird

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

我在Swagger之前的require蓝鸟,使用蓝鸟的承诺。但是在尝试使用Promise.return时我的应用程序正在爆炸。

代码看起来像

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

其中client是Swagger引用。

我得到的错误是

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

如果我将return替换为then(() => value),则此功能正常。 return应该是then的这种使用的简写。

经过调查,我发现Swagger客户退回的承诺失败了。

发生了什么?

2 个答案:

答案 0 :(得分:2)

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

const Promise = require('bluebird');

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

虽然在这种特定情况下,由于.return()只是为了节省一些打字,因此在Promise.resolve()中包装先前的承诺后,它实际上并不是净节省。但是,对于更有意义的方法,如.map()或类似的方法,它可能更有用。

答案 1 :(得分:1)

事实证明,Swagger明确地使用了Q promise库。

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

特别是,Bluebird有“返回”,而Q则没有。

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

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

  1. 使用“bluebird-q”项目用Bluebird替换Q.
  2. promisifyAll Swagger,而不是使用Swagger的内置承诺支持。