Node Koa如何将参数传递给中间件?

时间:2018-09-29 14:17:27

标签: node.js middleware koa koa-router

将我的Express应用程序转换为Koa ...

我正在谷歌搜索,而且我正在谷歌搜索,我找不到如何将额外的参数传递给Koa中间件。例如...

router.post('/', compose([
    Midware.verifyAuthToken, 
    Midware.bodySchemaTest(UserController.bodyAttribs),
    Midware.injectionTest
]), UserController.postNew);

我需要将一些可变的bodyAttribs(字符串数组)名称发送到bodySchemaTest中间件中,我不知道如何在Koa中做到这一点。

我现在正在尝试Koa。请分享您的专业知识:-)

1 个答案:

答案 0 :(得分:0)

好吧,我自己解决了。不知道这是聪明的方法还是执行此操作的“正确”方法,但是对我来说,解决方案是在每个控制器中创建一个中间件,该中间件在 ctx.state .bodyAttribs中设置预期的模式属性。 / p>

喜欢这个...

// /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();
};
...

因此,每个控制器都提供了定制中间件,用于设置我要验证的定制bodyAttrib。您可以使用此方法在ctx.state中设置1并将其传递给任意数量的额外参数,该参数始终在链中的下一个中间件中进行。跟随? :-)