2017-02-23 6 views
1

誰かがここで何が起こっているのか説明できますか?私はこれらが表現のためのミドルウェアであることを知っています、私は構文を見ています。Javascript es6 - 再割り当てまたはパラメータですか?

私はmustBeLoggedInのes6の構文を理解していますが、const forbidden = message => (req, res, next) => {は何をしているのですか? message req、res、nextの前に来る別のパラメータですか?もしそうなら、なぜかっこ内にないのですか?もともと私はこれが関数に別の変数名を代入しているだけだと考えました。だから私はそれをforbidden()またはmessage()といいますか?しかし、それがどのように使用されているかを見て、それはパラメータのように見える...

私が気付いたもう一つの興味深いものは、mustBeLoggedInが呼び出されていないと、取得要求でミドルウェアforbiddenが呼び出されているということです。どうして?

const mustBeLoggedIn = (req, res, next) => { 
 
     if (!req.user) { 
 
     return res.status(401).send('You must be logged in') 
 
     } 
 
     next() 
 
    } 
 

 
    const forbidden = message => (req, res, next) => { 
 
     res.status(403).send(message) 
 
    } 
 

 
module.exports = require('express').Router() 
 
\t .get('/', forbidden('only admins can list users'), (req, res, next) => 
 
\t \t User.findAll() 
 
\t \t .then(users => res.json(users)) 
 
\t \t .catch(next)) 
 
\t .post('/', (req, res, next) => 
 
\t \t User.create(req.body) 
 
\t \t .then(user => res.status(201).json(user)) 
 
\t \t .catch(next)) 
 
\t .get('/:id', mustBeLoggedIn, (req, res, next) => 
 
\t \t User.findById(req.params.id) 
 
\t \t .then(user => res.json(user)) 
 
\t \t .catch(next))

答えて

5

それが唯一の簡略化のためにコードの意味を不明瞭ように私はES6構文のこの使用を嫌います。最高のコードは、必ずしも最短の方法で書くとは限りません。人々にツールを与えて、彼らは時にそれらを不適切に使うことがあります。

forbidden()は、その1つの引数を使用するミドルウェアハンドラを返す1つの引数messageを受け取る関数です。したがって、これはパラメータが事前に組み込まれたカスタマイズされたミドルウェアハンドラを作成する方法です。 forbidden(msg)にコールすると、ミドルウェアとして使用できるミドルウェアハンドラ関数が返されます。

(一瞬異なるだろうが、ここでは使用されませんthisの違いを無視して)これを書いてのES5の方法のようになります。

const forbidden = function(message) { 
    return function(req, res, next) { 
     res.status(403).send(message); 
    } 
} 

をので、あなたはforbidden(someMsg)を呼び出すときに、あなたをミドルウェアとして使用できる関数を取得します。

もしそうなら、それはなぜかっこ内にありませんか?

ES6の矢印構文では、単一の引数はカッコで囲む必要はありません。複数の引数だけがかっこを必要とします。

私が気づいたもう一つ興味深いのは、ミドルウェアforbiddenあなたはどの戻り値を取得するために実行する必要がありますので、それを起動すると、実際のミドルウェア機能を返すので、これはget要求

に呼び出されていることですミドルウェアとして渡されます。

であり、mustBeLoggedInは渡され、呼び出されません。どうして?

これは既にミドルウェアの機能なので、参照を渡したいだけで、まだ呼び出すことはできません。FYI


、このルート:

.get('/', forbidden('only admins can list users'), (req, res, next) => 
    User.findAll() 
    .then(users => res.json(users)) 
    .catch(next)) 

forbidden()は常に403応答を返しますミドルウェアを返し、許可されませんので、あなたが示されたコードに基づいて、私には意味がありません。次のハンドラが呼び出されます。 forbidden()に現在のユーザーが実際に管理者であるかどうか(表示していない)を確認するロジックがある場合、これは意味をなさないでしょう。

+0

ありがとう、それは多くの意味があります! – Turnipdabeets

+0

@AnnaGarcia - あなたの質問の答えを追加しました。 – jfriend00

+0

ありがとう!私は、禁止されていることについていつも403を返すことに気付きました。なぜそれを忘れていたのでしょうか。私はそれを書いていないので、コードの間違いでなければならないと思う。 – Turnipdabeets

関連する問題