1
request = require('request')

auth =
url: ''
method: 'POST'
json:
  credentials:
  username: ""
  key: ""

exports = exports ? this

request auth, (err, res, body) ->
  exports.inside = body

console.log(exports.inside)


然后上面是带有 Node.js 请求模块的 Coffeescript。我无法弄清楚如何获取请求函数中的数据。这一直是我申请的主要障碍。

谢谢!

** 编辑**

Vadim Baryshev 的代码更新做到了!非常感谢 :) !

4

2 回答 2

1

您正在尝试在函数回调exports.inside中分配之前输出。request因为request函数是异步的。您可以通过回调或事件获取此函数的结果。

更新

request = require('request')

exports = exports ? this

getAuth = (callback) ->
  auth =
  url: ''
  method: 'POST'
  json:
    credentials:
      username: ""
      key: ""

  request auth, (err, res, body) ->
    exports.inside = body
    callback err, body

getAuth (err, body) ->
  # here is exports.inside ready
  console.log exports.inside
  # also you can access body and request error arguments here
  # body === exports.inside here
  # err is request error (is null/undifined if request is successful)
于 2012-11-03T16:37:25.887 回答
0

一旦请求函数完成,它会触发一个回调,这是唯一可以可靠访问“body”值的地方。

您遇到的问题是,当 console.log 函数运行时,由于请求未完成,回调尚未触发。

有关异步编程环境中程序流的更中肯的描述,请参阅Nodejs 中使用 fs.stat 的问题。

---编辑---例如:

考虑一下:

1: path='/tmp/file.txt'
2: result=''
3: fs.readFile path, (err,data) ->
4:    throw err if err
5:    result=data
6: console.log result

如果我们要跟踪这个操作,我们会发现执行顺序是 1,2,3,6,...4,5,其中,由于磁盘 i/o 的性质,省略号表示一些未知数量的时间。

因为读取操作需要一些时间才能完成,而不是等待它的结果,所以我们提供了一个回调函数,该函数将在未来某个不可预知的时刻被调用,当文件的内容被读取时,可以分配给'结果'。

当程序流程到达第6行时,由于文件读取操作尚未完成,因此尚未调用回调,因此尚未设置结果。

这是异步编程的本质,我们可以将浪费的时间用于其他目的,而不是等待操作完成后再继续。

---第二次编辑---好的,根据您的要求,这是您修改的示例,以便它可以工作。

request = require('request')

auth =
  url: ''
  method: 'POST'
  json:
    credentials:
    username: ""
    key: ""

exports = exports ? this

request auth, (err, res, body) ->
  exports.inside = body
  console.log(exports.inside)

请注意,正如现在已经多次描述的那样,您无法在回调之外访问请求的结果,因为您无法知道请求何时完成。

于 2012-11-03T16:39:16.463 回答