2017-02-23 15 views
1

Может кто-нибудь объяснить, что здесь происходит? Я знаю, что это промежуточное программное обеспечение для выражения, я смотрю на синтаксис.Javascript es6 - это переназначение или параметр?

Я понимаю синтаксис es6 для mustBeLoggedIn, но я не уверен, что делает const forbidden = message => (req, res, next) => {. Есть message еще один параметр, который предшествует req, res, next? Если да, то почему это не в скобках? Первоначально я думал, что это просто присвоение функции переменной имени переменной. Поэтому я мог бы назвать это forbidden() или message(), нет? Но глядя на то, как он используется, он больше похож на параметр ...

Еще одна интересная вещь, которую я заметил, заключается в том, что промежуточное ПО forbidden вызывается в запросе на получение, а mustBeLoggedIn передается и не вызывается. Зачем?

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() - это функция, которая принимает один аргумент message, который возвращает обработчик промежуточного программного обеспечения, который использует этот один аргумент. Таким образом, это способ создания настраиваемого промежуточного обработчика с параметром, предварительно встроенным. Когда вы вызываете forbidden(msg), он возвращает функцию промежуточного обработчика, которую затем можно использовать в качестве промежуточного программного обеспечения.

ES5 способ написания этого (не обращая внимания на мгновение разницу в this, который будет отличаться друг от друга, но не используется здесь) будет выглядеть следующим образом:

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

Смежные вопросы