Node Koa 如何将参数传递给中间件?
Node Koa How do I pass a param into middleware?
正在将我的 Express 应用程序转换为 Koa...
我在谷歌上搜索,我在谷歌上搜索,我找不到如何将额外的参数传递给 Koa 中间件。例如...
router.post('/', compose([
Midware.verifyAuthToken,
Midware.bodySchemaTest(UserController.bodyAttribs),
Midware.injectionTest
]), UserController.postNew);
我需要将一些变量 bodyAttribs(字符串数组)名称发送到 bodySchemaTest 中间件,但我不知道如何在 Koa 中执行此操作。
我正在尝试 Koa。请分享您的专业知识:-)
好的,我自己解决了。不确定这是聪明的还是 "right" 的方法,但我的解决方案是在每个控制器中创建一个中间件,在 ctx.state[= 中设置预期的模式属性18=].bodyAttribs.
像这样...
// /src/routers/user.router.ts
import * as UserController from '../controller/user.controller';
import * as Midware from './middleware';
import Router from 'koa-router';
import compose from 'koa-compose';
const router = new Router();
router.prefix('/user');
router.get('/', Midware.verifyAuthToken, UserController.getAll);
router.post('/', compose([
UserController.bodyAttribs,
Midware.verifyAuthToken,
Midware.bodySchemaTest,
Midware.injectionTest,
]), UserController.postNew);
module.exports = router;
// /src/controller/user.controller.ts
import { Context } from 'koa';
import { UserData } from '../data/mongo/user.data.mongo';
import { UserModel } from '../model/user.model';
import { EmailValidate } from '../service/email-validate.service';
import * as Logger from '../util/logger';
const dataContext = new UserData();
// Middleware to set bodyAttribs
export const bodyAttribs = async (ctx: Context, next: any) => {
ctx.state.bodyAttribs = ['handle', 'processUserOptions', 'name', 'email', 'pass', 'passConfirm'];
return await next();
};
...
因此每个控制器都提供了自定义中间件,用于设置我要验证的自定义 bodyAttribs。您可以使用这种方法将 1 设置并传递给任何数量的额外参数,无论您需要什么,在 ctx.state 中,它总是继续到链中的下一个中间件。跟随? :-)
正在将我的 Express 应用程序转换为 Koa...
我在谷歌上搜索,我在谷歌上搜索,我找不到如何将额外的参数传递给 Koa 中间件。例如...
router.post('/', compose([
Midware.verifyAuthToken,
Midware.bodySchemaTest(UserController.bodyAttribs),
Midware.injectionTest
]), UserController.postNew);
我需要将一些变量 bodyAttribs(字符串数组)名称发送到 bodySchemaTest 中间件,但我不知道如何在 Koa 中执行此操作。
我正在尝试 Koa。请分享您的专业知识:-)
好的,我自己解决了。不确定这是聪明的还是 "right" 的方法,但我的解决方案是在每个控制器中创建一个中间件,在 ctx.state[= 中设置预期的模式属性18=].bodyAttribs.
像这样...
// /src/routers/user.router.ts
import * as UserController from '../controller/user.controller';
import * as Midware from './middleware';
import Router from 'koa-router';
import compose from 'koa-compose';
const router = new Router();
router.prefix('/user');
router.get('/', Midware.verifyAuthToken, UserController.getAll);
router.post('/', compose([
UserController.bodyAttribs,
Midware.verifyAuthToken,
Midware.bodySchemaTest,
Midware.injectionTest,
]), UserController.postNew);
module.exports = router;
// /src/controller/user.controller.ts
import { Context } from 'koa';
import { UserData } from '../data/mongo/user.data.mongo';
import { UserModel } from '../model/user.model';
import { EmailValidate } from '../service/email-validate.service';
import * as Logger from '../util/logger';
const dataContext = new UserData();
// Middleware to set bodyAttribs
export const bodyAttribs = async (ctx: Context, next: any) => {
ctx.state.bodyAttribs = ['handle', 'processUserOptions', 'name', 'email', 'pass', 'passConfirm'];
return await next();
};
...
因此每个控制器都提供了自定义中间件,用于设置我要验证的自定义 bodyAttribs。您可以使用这种方法将 1 设置并传递给任何数量的额外参数,无论您需要什么,在 ctx.state 中,它总是继续到链中的下一个中间件。跟随? :-)