Как я могу вернуться, когда промежуточное программное обеспечение переходит к следующему ()?

#node.js #express

#node.js #экспресс

Вопрос:

Я использую express-ip-access-control для проверки ACL.

Моя функция промежуточного программного обеспечения выглядит следующим образом:

 const ipAccessControl = require('express-ip-access-control')

function accessControl (req, res, next) {
    ipAccessControl(someOptions)(req, res, next)

    // additional ACL checking logic
    ...
    switch(result) {
        case ALLOW:
            next()
            break
        case DENY:
            res.status(400).send("denied")
    }
}

 

Этот ipAccessControl работает хорошо, но я не знаю, как вернуться, когда ipAccessControl разрешает доступ и вызывает next() .

Приведенный выше код всегда выполняет как ipAccessControl, так и дополнительную логику проверки ACL.

Есть ли способ проверить результат ipAccessControl и возвращать только при вызове next() ipAccessControl ?

Я не хочу, чтобы моя дополнительная логика проверки вызывалась, когда доступ разрешен ipAccessControl.

Этот ipAccessControl должен вызываться перед дополнительной логикой проверки ACL.

Любая мысль приветствуется.

Ответ №1:

Вы можете передать свою собственную функцию вместо next() , и тогда вы узнаете, когда это будет сделано:

 const ipAccessControl = require('express-ip-access-control')

function accessControl (req, res, next) {
    ipAccessControl(someOptions)(req, res, function(err) {
        if (err) {
            // call the actual next with the error
            return next(err);
        } else {
            // additional ACL checking logic
            ...
            switch(result) {
                case ALLOW: ...
                case DENY: ...
            }
            // when done successfully, call next() here
            // or if there's an error, then send an error response
            // or call next(err)
        }
    })

}
 

Комментарии:

1. Спасибо за ваш ответ. Не могли бы вы, пожалуйста, объяснить подробнее? Я не хочу, чтобы моя дополнительная логика проверки вызывалась, когда доступ разрешен ipAccessControl . Когда ipAccessControl доступ не проверяется, я перепроверяю его с помощью своего дополнительного кода.

2. @yoon — Вам нужно лучше объяснить, что ipAccessControl() и когда именно вы делаете, и не хотите выполнять больше кода, поскольку, возможно, моя первая интерпретация того, что вы пытались выполнить, не завершена. Пожалуйста, объясните подробнее. Когда я смотрю на документацию этого модуля, похоже, что он отправляет ответ об ошибке, когда он не разрешает, и вызывает next() , когда разрешает. Итак, для какого именно случая вы хотите выполнить больше кода?

3. Моя программа проверяет ACL IP и авторизацию hmac. Запрос отклоняется только тогда, когда ни один из них не удовлетворяет. Я использую ipAccessControl для IP ACL. Если запрос удовлетворяет этому условию ACL, он разрешает последующие операции. Если запрос поступает с неизвестного IP-адреса, вместо отклонения запроса он снова проверяет, авторизован ли запрос hmac. Если это разрешено hmac, программа принимает запрос.

4. @yoon — Насколько я могу судить ipAccessControl() , модуль написан не для использования таким образом. Это промежуточное программное обеспечение, которое вызывает next() , когда оно завершается успешно, или отправляет ответ об ошибке, когда этого не происходит. Кроме какого-то гигантского взлома, который пытается исправить запрос, чтобы перехватить и предотвратить отправку ответа, я не вижу никакого способа узнать, что проверка не прошла, и позволить вам продолжить работу с другим кодом.

5. @yoon — Если бы это был мой код, я бы, вероятно, разветвил ipAccessControl() модуль и изменил его, чтобы его можно было использовать как обычную функцию, которая возвращает результат, позволяющий мне использовать с ним обычную логику, поэтому он никогда не отправляет ответ. Или замените его чем-то другим, что позволяет моей логике работать так, как я хочу.