2016-10-24 7 views
0

Я работал на Node.js и столкнулся некоторые проблемы со следующим кодом, проблема решена, но я хочу знать, почему: (_ является lodash, request является request^2.60.0 пакета в НОМ)В чем разница между следующими двумя блоками кода?

var send = (options, type) => 
    (req, res, next) => { 
     var defaultOptions = { 
      baseUrl: config.urlprefix, 
      method: 'GET', 
      encoding: 'utf8', 
      header: { 
       'Content-Type': 'application/json' 
      } 
     } 
     options = options || {}; 

     if (_.isFunction(options)) { 
      options = _.assign(defaultOptions, options(req)); 
     } 
     else if (_.isObject(options)) { 
      options = _.assign(defaultOptions, options); 
     } 

     request(options, parseResToJSONAndSend(res, type)); 
    }; 

и это не очень хорошо работает: второй (и более) раз, когда я называю send, параметр options в request точно такой же, как в первый раз, когда я называю send, даже если я изменил PARAMS перейти к send, и никогда не изменится после т.

Так что я изменить код следующим образом:

var send = (options, type) => 
    (req, res, next) => { 
     var defaultOptions = { 
      baseUrl: config.urlprefix, 
      method: 'GET', 
      encoding: 'utf8', 
      header: { 
       'Content-Type': 'application/json' 
      } 
     } 
     var opt = options || {}; 

     if (_.isFunction(options)) { 
      opt = _.assign(defaultOptions, opt(req)); 
     } 
     else if (_.isObject(options)) { 
      opt = _.assign(defaultOptions, opt); 
     } 

     request(opt, parseResToJSONAndSend(res, type)); 
    }; 

и на этот раз он работает хорошо. Но я не знаю, где проблема. Может кто-нибудь мне помочь? Благодаря!


, чтобы понять: ДЕФ из stock контроллера:

var apis = { 
    stocks: (req) => ({ 
     url: SOME_URL 
    }), 
    ... 
}; 

var mod = {}; 
Object.keys(apis).map((key) => { 
    mod[key] = request(apis[key]); 
}); 
module.exports = mod; 

использование stock контроллера:

router.get('/some-path',stock.stocks); 

Защиту от parseResToJSONAndSend:

var parseResToJSONAndSend = (res, type) => 
    (err, resp, data) => { 
     if (err) { 
      console.log("Response err", err); 
     } else if (resp.statusCode < 200 || resp.statusCode > 299) { 
      console.log("Status code not in range 200..299:", resp.statusCode, resp.request.uri.href); 
     } else { 
      console.log(resp.request.uri.href, resp.statusCode); 
      try { 
       if (type == 'json') { 
        res.json(JSON.parse(data)); 
       } 
       else { 
        res.send(data); 
       } 
      } catch (e) { 
       console.log("Err in JSON parse", e); 
      } 
     } 
    }; 
+0

да, второй раз я прохожу различные варианты – cmal

+0

Это где я не люблю некоторые из синтаксиса контекстного ES6. Если вы написали это в синтаксисе ES5, я готов поспорить, что для вас будет более очевидным, что происходит. – jfriend00

+0

Спасибо. Вы имеете в виду, что нет очевидной причины, почему это происходит? – cmal

ответ

0

В первом блоке _.assign(defaultOptions, options(req)) изменил значение параметров, поэтому параметр options, переданный в send, был изменен на объект, который совершает следующие вызовы: send переходит в ветвь else if.

Во втором блоке _.assign(defaultOptions, options(req)) также изменит параметр, переданный на send. Так что это неправильно.

Наконец код был изменен на:

var send = (options, type) => 
    (req, res, next) => { 
     var defaultOptions = { 
      baseUrl: config.urlprefix, 
      method: 'GET', 
      encoding: 'utf8', 
      header: { 
       'Content-Type': 'application/json' 
      } 
     } 
     var opt = _.cloneDeep(options || {}); 

     if (_.isFunction(options)) { 
      opt = _.assign({}, defaultOptions, options(req)); 
     } 
     else if (_.isObject(options)) { 
      opt = _.assign({}, defaultOptions, opt); 
     } 

     request(opt, parseResToJSONAndSend(res, type)); 
    }; 

 Смежные вопросы

  • Нет связанных вопросов^_^