在JavaScript

时间:2016-12-21 10:34:38

标签: javascript node.js parameter-passing eslint

我正在编写Node.js应用程序。在某些地方我必须修改函数的参数。例如,这个Express中间件用于添加用户请求,以便稍后查看:

exports.fetchUserDetails = function (req, res, next) {
  httprequest(opts, function (err, res, body) {
    req.user = body.user;
    next()
  }
}

问题是,我开始使用静态代码分析器(ESLint)并且总是抱怨重新分配函数参数(http://eslint.org/docs/rules/no-param-reassign)。我猜这个规则是有原因的。

我知道修改函数参数可能很糟糕,如下例所示:

function modifyParam(param) {
  param.a = 2
}

var obj = { a: 1 };
console.log(obj); // outputs { a: 1 };
modifyParam(obj);
console.log(obj); // outputs { a: 2 };

但我没有真正看到重构我的中间件的另一种方法,而没有重新分配参数。

所以我的问题是:

  • 我什么时候可以使用params重新分配?
  • 如何重构我的中间件以避免这种情况? (或者我应该保留它)

2 个答案:

答案 0 :(得分:3)

我认为在这种情况下没关系。您正在设置将由处理请求的后续函数使用的状态。

linters抱怨这个的原因是,在调用函数时通常不清楚它会修改其参数,导致错误,正如您在问题中所描述的那样。

但是在这种情况下,你的函数只有一个调用者,快速框架,并且总是清楚你的函数将被调用到哪种情况,所以我不认为这是一个问题。

答案 1 :(得分:3)

您提供的示例不包括重新分配函数参数。

exports.fetchUserDetails = function (req, res, next) {
  httprequest(opts, function (err, res, body) {
    req.user = body.user;
    next()
  }
}

您只需将新字段附加到req引用,但不会覆盖req本身。

Express中间件从一开始就使用这种方法,并没有任何问题。