下面两段代码有什么区别?

What is the difference between the following two blocks of code?

我一直在Node.js工作,遇到了以下代码的问题,问题已解决,但我想知道为什么: (_lodashrequest是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));
     };

并且效果不佳:第二次(以及更多次)我调用 sendoptions 中的参数 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));
    };