2016-12-21 7 views
0

私はNode.jsアプリケーションを作成しています。関数の引数を変更する必要がある場所がいくつかあります。例えば、私は後でそれを見ることができます要求するためにユーザーを追加するため、このエクスプレスミドルウェア:事があるJavaScriptの関数引数を変更するのは悪い習慣ですか?

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

私はこの場合は良いと思います。要求を処理する後続の関数によって使用される状態を設定しています。

lintがこれに不平を言う理由は、関数を呼び出すときに引数が変更され、バグにつながることがよくあります。

しかし、この場合、関数には呼び出し元の明示的なフレームワークしかありません。関数が呼び出されるのはいつも明確です。問題はないと思います。

2

指定した例には、関数の引数を再割り当てすることは含まれていません。

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

あなただけreq参照に新しいフィールドを添付していますが、req自体を上書きしません。

Expressミドルウェアはこのアプローチを最初から使用していますが、何も問題はありません。

関連する問題