С expressJS, res и req проходят через функции? - PullRequest
0 голосов
/ 12 сентября 2011

Я использую 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 ]

1 голос
/ 13 сентября 2011

Это довольно распространенный сценарий.Одним из вариантов является определение searchResults внутри exports.search, но тогда exports.search может стать громоздким.

Не имеет смысла определять searchResults таким образом, чтобы он использовал res когда 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 из хэша, используя синтаксис аргумента деструктурирования.

1 голос
/ 12 сентября 2011

Подойдет стандартное связывание.

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

...

searchResults = (res, err, data)->
  res.write 'hello'
  console.log data
  console.log 'here'
  return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...