如何使用请求库和Bluebird发送帖子请求?

gba*_*hik 5 javascript request node.js promise bluebird

所以继承我的设置:

var Promise = require("bluebird");
var request = Promise.promisify(require('request'));
Run Code Online (Sandbox Code Playgroud)

这有效:

request('url')
Run Code Online (Sandbox Code Playgroud)

它返回一个承诺

这不是:

request.post('url', {form: {type: 'artist'}})
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

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
Run Code Online (Sandbox Code Playgroud)

关于如何使这项工作的任何想法?这样做的正确方法是什么?

Ben*_*aum 8

当你宣传请求时,你只会返回返回的函数.相反 - 使用promisifyAll它可以宣传整个对象.既然request你没有得到错误.

var Promise = require("bluebird");

var request = Promise.promisifyAll(require('request')); // this will work
Run Code Online (Sandbox Code Playgroud)

  • @gbachik是的,你必须使用`postAsync` (2认同)
  • @majidarif好问题,默认情况下bluebird(直到v3)将解析为一个数组,你可以使用spread:`request.getAsync("fooBar").spread(function(resp,body`)并在那里访问它或者代替`.得到(1)`获得第二个参数然后`然后`它 (2认同)