[英]Node Koa How do I pass a param into middleware?
Converting my Express app to Koa... 将我的Express应用程序转换为Koa ...
I'm googling and I'm googling, I can't find how to pass extra params into Koa middleware. 我正在谷歌搜索,也正在谷歌搜索,我找不到如何将额外的参数传递给Koa中间件。 For example...
例如...
router.post('/', compose([
Midware.verifyAuthToken,
Midware.bodySchemaTest(UserController.bodyAttribs),
Midware.injectionTest
]), UserController.postNew);
I need send some variable bodyAttribs (string array) names into the bodySchemaTest middleware and I don't know how to do this in Koa. 我需要将一些可变的bodyAttribs(字符串数组)名称发送到bodySchemaTest中间件中,我不知道如何在Koa中执行此操作。
I'm just now trying Koa. 我现在正在尝试Koa。 Please share your expertise :-)
请分享您的专业知识:-)
Ok I worked it out myself. 好吧,我自己解决了。 Not sure if this is smart or the "right" way to do this but the solution for me was to create a piece of middleware in each controller that sets expected schema attribs in ctx.state .bodyAttribs.
不知道这是聪明的方法还是执行此操作的“正确”方法,但是对我来说,解决方案是在每个控制器中创建一个中间件,该中间件在ctx.state .bodyAttribs中设置预期的模式属性。
Like this... 像这样...
// /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();
};
...
So each controller provides the custom middleware that set the custom bodyAttribs I want to verify. 因此,每个控制器都提供了自定义中间件,该中间件设置了我要验证的自定义bodyAttrib。 You can use this approach to set and pass 1 to any number of extra params, whatever you need, in ctx.state which always goes on to next middleware in chain.
您可以使用此方法在ctx.state中设置1并将其传递给任意数量的额外参数,该参数始终在链中的下一个中间件中进行。 Follow?
跟随? :-)
:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.