如何使用Request库和Bluebird发送POST请求?

5

以下是我的配置:

var Promise = require("bluebird");
var request = Promise.promisify(require('request'));

这个可以正常工作:

request('url')

它返回一个承诺。
这个不会:
request.post('url', {form: {type: 'artist'}})

出现以下错误:

TypeError: Object function promisified(_arg0,_arg1) { ... }has no method 'post'
at /Users/beamer30/projects/wevo/controllers/music.js:85:30
at Array.map (native)
at MusicSearch.spotifyRelated (/Users/beamer30/projects/wevo/controllers/music.js:84:22)
at MusicSearch.findRelatedArtists (/Users/beamer30/projects/wevo/controllers/music.js:48:7)
at musicController.search (/Users/beamer30/projects/wevo/controllers/music.js:100:17)
at Layer.handle [as handle_request] (/Users/beamer30/projects/wevo/node_modules/express/lib/router/layer.js:76:5)
at next (/Users/beamer30/projects/wevo/node_modules/express/lib/router/route.js:100:13)
at Route.dispatch (/Users/beamer30/projects/wevo/node_modules/express/lib/router/route.js:81:3)
at Layer.handle [as handle_request] (/Users/beamer30/projects/wevo/node_modules/express/lib/router/layer.js:76:5)
at /Users/beamer30/projects/wevo/node_modules/express/lib/router/index.js:227:24

有关如何使其工作的任何想法? 正确的做法是什么?

1个回答

8

当您执行请求返回值的Promise时,只会返回这个函数的Promise。相反,您可以使用promisifyAll来将整个对象 promisify。由于request是一个对象,所以您没有收到错误。

var Promise = require("bluebird");

var request = Promise.promisifyAll(require('request')); // this will work

1
抱歉,不幸的是,该POST请求不再正确发送了? 有没有.postAsync()函数? - gbachik
2
@gbachik 是的,完全正确,你必须使用 postAsync - Benjamin Gruenbaum
@BenjaminGruenbaum 你怎么获取请求体?Promises 只接受回调函数的第二个参数作为请求体,因为它是第三个参数。 - majidarif
2
@majidarif 很好的问题, 默认情况下,bluebird(直到v3)将解析为数组,您可以使用spread:request.getAsync("fooBar").spread(function(resp, body) 并在那里访问它,或者使用.get(1)来获取第二个参数,然后再使用 then - Benjamin Gruenbaum
1
postAsync的文档在哪里? - sheldonkreger
请阅读bluebird promisifyAll文档 - 它可以将.post转换为promise。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接