我有一个简单的工作superagent / async瀑布请求,看起来像这样:

  request = require 'superagent'
  user = request.agent()
  async.waterfall [
    (cb)->
      user.post('http://localhost:3000/form').send(name: 'Bob').end(cb)
  ], (err, res)->
    console.log err
    console.log res


这将成功打印我的完整http响应,并且errundefined

如果我执行额外的步骤执行完全相同的操作:

  request = require 'superagent'
  user = request.agent()
  async.waterfall [
    (cb)->
      user.post('http://localhost:3000/form').send(name: 'Bob').end(cb)
    (err, res)->
      # this is never reached
      cb()
  ], (err, res)->
    console.log err # this now prints out the response
    console.log res # this is undefined


err现在是响应。 res未定义。这是我遇到的superagent问题,还是我只是错误地使用了asyncwaterfall

最佳答案

这是SuperAgent的“问题”,它们如何选择处理作为回调传递的功能。如果该函数恰好期望length property所报告的两个参数,则“传统” errres会像Async一样给出。如果您传递的函数未报告其长度为2,则给定的第一个参数为res。这是SuperAgent's source for handling callbacks

Request.prototype.callback = function(err, res){
  var fn = this._callback;
  if (2 == fn.length) return fn(err, res);
  if (err) return this.emit('error', err);
  fn(res);
};


为了保证您的回调能够按预期被调用,我建议将一个匿名函数传递给end,以便它明确将其长度报告为2,这样您就可以将任何错误传递给回调。

request = require 'superagent'
user = request.agent()
async.waterfall [
  (cb) ->
    user.post('http://localhost:3000/form').send(name: 'Bob').end (err, res) ->
      cb err, res
  (err, res) ->
    # err should be undefined if the request is successful
    # res should be the response
    cb null, res
], (err, res) ->
  console.log err # this should now be null
  console.log res # this should now be the response

关于node.js - Superagent在异步 waterfall 中移动响应回调位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23440922/

10-11 09:18