下面两段代码有什么区别?
What is the difference between the following two blocks of code?
我一直在Node.js
工作,遇到了以下代码的问题,问题已解决,但我想知道为什么:
(_
是lodash
,request
是npm中的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 pass改成了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);
def of 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);
}
}
};
在第一个块中,_.assign(defaultOptions, options(req))
更改了选项的值,因此传递给 send
的参数 options
更改为一个对象,从而进行后续调用 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));
};
我一直在Node.js
工作,遇到了以下代码的问题,问题已解决,但我想知道为什么:
(_
是lodash
,request
是npm中的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 pass改成了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);
def of 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);
}
}
};
在第一个块中,_.assign(defaultOptions, options(req))
更改了选项的值,因此传递给 send
的参数 options
更改为一个对象,从而进行后续调用 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));
};