Я работал на 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);
}
}
};
да, второй раз я прохожу различные варианты – cmal
Это где я не люблю некоторые из синтаксиса контекстного ES6. Если вы написали это в синтаксисе ES5, я готов поспорить, что для вас будет более очевидным, что происходит. – jfriend00
Спасибо. Вы имеете в виду, что нет очевидной причины, почему это происходит? – cmal