Можно ли промежуточному программному обеспечению Express.js полагаться на предыдущее промежуточное программное обеспечение в цепочке? - PullRequest
1 голос
/ 25 марта 2019

Допустим, у меня есть запрос POST в моем API POST /api/comments, где я создаю комментарий. Комментарии принимаются в виде массива дерева (у каждого комментария есть свойство children, которое может иметь подкомментарии). У меня есть несколько «событий», которые происходят перед отправкой ответа.

Я могу поместить весь необходимый код в одну функцию промежуточного программного обеспечения следующим образом.

function postComments(req, res, next) {
    // handle general authentication
    if (!isAuthenticated()) {
        next("not authenticated ...");
    }

    // handle more specific authentication (ex. admin)
    if (!isAdmin()) {
        next("not admin ...")
    }

    // validate req.body.comments so that each comment has allowed form
    if (!areCommentsValid()) {
        next("not valid ...");
    }

    // modify comments for database insertion
    const modifiedComments = modifyComments();

    // database insertion
    db.insert(modifiedComments)

    res.sendStatus(201);
}

В приведенном выше примере общая аутентификация и аутентификация администратора могут использоваться на нескольких маршрутах, и следующие промежуточные программы не полагаются на них, код все еще работает. Так что код этих 2 имеет смысл.

В этом примере мое промежуточное программное обеспечение делает несколько вещей.

Я думал, что смогу разбить следующий код на несколько промежуточных программ.

function userAuth(req, res, next) {
    // handle user authentication
}

function adminAuth(req, res, next) {
    // handle admin auth
}

function validateComments(req, res, next) {
    // handle req.body.comments validation
}

function modifyComments(req, res, next) {
    // modify comments
    // req.commentsForDb = modifiedComments;
}

function postComments(req, res, next) {
    // insert req.commentsForDb into database
}

Итак, теперь я разделил свое промежуточное ПО на 4 разных промежуточных ПО, но проблема в том, что промежуточные программы зависят друг от друга.

postComments требуется modifyComments для установки req.commentsForDb, modifyComments требуется validateComments и т. Д.

Какой метод предпочтительнее?

1 Ответ

2 голосов
/ 25 марта 2019

Это совершенно правильно и именно так и предназначено промежуточное программное обеспечение.Пока вы правильно вызываете next с кодом ошибки, когда что-то идет не так в промежуточном программном обеспечении, где вы должны прекратить пересылку к следующему.

Дополнительным преимуществом является то, что вы можете повторно использовать ваше промежуточное программное обеспечение во многих различных маршрутах.Еще одна вещь, которую вы можете сделать, это генератор закрытия промежуточного программного обеспечения, например, промежуточное программное обеспечение для аутентификации, основанное на роли:

function auth(role) {
     return function(req, res, next) {
          // get my user
          // ...
          // check user role
          if user.role != role {
              return next(new Error("Auth failed"))
          }
          return next()
     }
}

// this route is for admins
app.get(
    "/foo", 
    auth("admin"),
    foo
)

// this one for users
app.get(
    "/bar", 
    auth("user"),
    foo
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...