Шаблон промежуточного программного обеспечения для фронтенд-разработки

Апплет WeChat

предисловие

Режим промежуточного программного обеспечения — это режим разработки, который сегодня широко используется различными фреймворками, особенно веб-фреймворками. такие как знаменитыйExpress, Koaи т. д. использовать промежуточное программное обеспечение для обработки запросов. Итак, что такое шаблон промежуточного программного обеспечения?

что такое промежуточное ПО

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

Мы можем представить веб-запрос как последовательный конвейер. В конвейере есть несколько уровней. Данные запроса начинаются с источника и проходят через каждый уровень по очереди. Каждый уровень работает независимо, что может не только отвечать на данные напрямую, но и Также немного отреагируйте на запрос.

Промежуточное ПО для Коа

В качестве примера возьмем промежуточное ПО Koa.

router
    .get('/users', loginChecker, async ctx => {
    	const users = await db.getUsers()
        ctx.body = users
	})
    .delete('/users/:id', adminChecker, async ctx => {
    	const { id } = ctx.params
        await db.deleteUserById(id)
    	ctx.body = { error: false }
	})

Мы используемloginCheckerчтобы проверить, вошел ли пользователь в систему, и для операций удаления с высоким риском мы используемadminCheckerчтобы определить, есть ли у пользователя права администратора.

Как видите, когда мы пишем конкретные функции обработки маршрутизации, нам нужно учитывать только логику транзакций, что значительно снижает умственную нагрузку. Мы даже можем обернуть промежуточное ПО для обработки ошибок в самом внешнем слое,catchЖивите со всеми исключениями и обрабатывайте их единообразно — вот почему я их не используюawaitодин слой упаковкиtry/catch.

мы не обсуждаемКак разработать промежуточное ПО Koa, давайте поговорим о том, как реализовать шаблон промежуточного программного обеспечения.

луковая модель

Koa реализует промежуточное ПО на основе луковой модели, при обработке запросов оно всегда начинается с внешнего промежуточного ПО, переходит к самому внутреннему слою и, наконец, возвращается к самому внешнему слою. Основываясь на этом выводе, мы можем использовать массив для последовательного хранения мидлвара и вызывать их один за другим.

async function exec(middlewares, ctx) {
    let index = 0
    
    const next = async () => {
        const current = middlewares[index++]
        if (current) {
            await current(ctx, next)
        }
    }
    
    await next()
}

const ware1 = async (ctx, next) => {
    ctx.body = 'This is ware 1'
    await next()
    console.log("ware1 is back")
}

// 不调用 next,则不会进入下个中间件
const ware2 = async (next) => {
    ctx.body = 'Hello, world'
}

ctxЭто означает контекст (Context), который является мостом для связи промежуточного программного обеспечения.Каждое промежуточное программное обеспечение модифицируетсяctxдля возврата данных. Такие какKoaпутем измененияctx.bodyизменить тело ответа.

Луковая модель реализуется путем передачи и вызова метода next текущему ПО промежуточного слоя для управления процессом выполнения ПО промежуточного слоя. Примечательно,ware2не позвалиnextметод, поэтому независимо от того, есть ли за ним другое промежуточное ПО, он станет самым внутренним слоем в луковой модели, а затем вернется к внешнему промежуточному ПО.

постскриптум

В этой статье рассказывается, что такое промежуточное ПО, и прилагается простая реализация. Если вы являетесь разработчиком апплета WeChat, вы можете обратиться к библиотеке запросов апплета, которую я разработал с использованием режима промежуточного программного обеспечения.minapp-request, для более полной реализации кода.

Если вам это нравится, пожалуйста, дайте ему большой палец вверх, и будет лучше, если вы сможете подписаться на него.