使用expressJS,res和req是否会传递给函数?

时间:2011-09-12 18:00:07

标签: node.js coffeescript express

我正在使用CoffeeScript,只是抬头:

searchResults = (err, data)->
  res.write 'hello'
  console.log data
  console.log 'here'
  return


exports.search = (req, res) ->
  res.writeHead 200, {'Content-Type': 'application/json'}
  location = req.param 'location'
  item = req.param 'item'

  geoC = googlemaps.geocode 'someaddress', (err, data) ->
      latLng = JSON.stringify data.results[0].geometry.location

      myModule.search latLng, item, searchResults

      return
  return

searchResults函数不了解res,那么如何将数据返回给浏览器?

2 个答案:

答案 0 :(得分:1)

标准绑定可以。

myModule.search latLng, item, searchResults.bind(null, res)

...

searchResults = (res, err, data)->
  res.write 'hello'
  console.log data
  console.log 'here'
  return

答案 1 :(得分:1)

这是一种非常常见的情况。一种选择是在searchResults内定义exports.search,但exports.search可能会变得笨拙。

searchResultsres不是参数时使用res的方式定义是没有意义的。但是您可能不愿意使用具有多个参数的函数,当您有多个需要访问相同状态的回调时,这可能导致重复的代码。一个好的选择是使用单个哈希来存储该状态。在这种情况下,您的代码可能类似于

searchResults = (err, data, {res}) ->
  ...

exports.search = (req, res) ->
  res.writeHead 200, {'Content-Type': 'application/json'}
  location = req.param 'location'
  item = req.param 'item'
  state = {req, res, location, item}

  geoC = googlemaps.geocode 'someaddress', (err, data) ->
      state.latLng = JSON.stringify data.results[0].geometry.location
      myModule.search state, searchResults
      return
  return

请注意,myModule.search现在只接受state哈希和回调;然后它将state哈希作为第三个参数传递给该回调(searchResults),它使用解构参数语法将res拉出哈希。