3.57.9 • Published 5 months ago

@eggjs/tegg-controller-plugin v3.57.9

Weekly downloads
-
License
-
Repository
github
Last release
5 months ago

@eggjs/tegg-controller-plugin

使用注解的方式来开发 egg 中的 Controller

Install

# tegg 注解
npm i --save @eggjs/tegg
# tegg 插件
npm i --save @eggjs/tegg-plugin
# tegg controller 插件
npm i --save @eggjs/tegg-controller-plugin

Prepare

// tsconfig.json
{
  "extends": "@eggjs/tsconfig"
}

Config

// config/plugin.js
exports.tegg = {
  package: '@eggjs/tegg-plugin',
  enable: true,
};

exports.teggController = {
  package: '@eggjs/tegg-controller-plugin',
  enable: true,
};

Usage

Middleware

Middleware 支持多个入参,依次传入要生效的中间件 中间件注解,可以添加在类/方法上。添加在类上时,对类上所有方法生效,添加在方法上时,只对当前方法生效。

// app/middleware/global_log.ts
import { Context } from 'egg';
import type { Next } from '@eggjs/controller-decorator';

export default async function globalLog(ctx: Context, next: Next) {
  ctx.logger.info('have a request');
  return next();
}

export default async function globalLog2(ctx: Context, next: Next) {
  ctx.logger.info('have a request2');
  return next();
}

// app/controller/FooController.ts
import { Middleware } from '@eggjs/tegg';
@Middleware(globalLog,globalLog2)
export class FooController {
  @Middleware(methodCount)
  
  async hello() {
  }
}

Context

当需要 egg context 时,可以使用 @Context 注解来声明。

// app/controller/FooController.ts
import { Context, EggContext } from '@eggjs/tegg';

export class FooController {
  @Middleware(methodCount)
  async hello(@Context() ctx: EggContext) {
  }
}

HTTP 注解

HTTPController/HTTPMethod

@HTTPController 注解用来声明当前类是一个 HTTP controller,可以配置路径前缀。 @HTTPMethod 注解用来声明当前方法是一个 HTTP method,只有带了这个注解,HTTP 方法才会被暴露出去,可以配置方法路径,

// app/controller/FooController.ts
import { Context, EggContext, HTTPController, HTTPMethod, HTTPMethodEnum } from '@eggjs/tegg';

@HTTPController({
  path: '/foo',
})
export class FooController {
  @HTTPMethod({
    method: HTTPMethodEnum.GET,
    path: '/hello',
  })
  async hello() {
  }
}

Param

HTTP 协议中有各种各样的传参方式,比如 query,path,body 等等。

HTTPBody

接收 body 参数

// app/controller/FooController.ts
import { Context, EggContext, HTTPController, HTTPMethod, HTTPMethodEnum, HTTPBody } from '@eggjs/tegg';

@HTTPController({
  path: '/foo',
})
export class FooController {
  @HTTPMethod({
    method: HTTPMethodEnum.GET,
    path: '/hello',
  })
  async hello(@HTTPBody() name: string) {
    return `hello, ${name}`;
  }
}
HTTPQuery/HTTPQueries

两者的区别在于参数是否为数组, HTTPQuery 只会取第一个参数,HTTPQueries 只提供数组形式。 HTTPQuery 的参数类型只能是 string, HTTPQueries 的参数类型只能是 string[]。

// app/controller/FooController.ts
import { Context, EggContext, HTTPController, HTTPMethod, HTTPMethodEnum, HTTPQuery, HTTPQueries } from '@eggjs/tegg';

@HTTPController({
  path: '/foo',
})
export class FooController {
  @HTTPMethod({
    method: HTTPMethodEnum.GET,
    path: '/hello',
  })
  async hello(
    // /foo/hello?name=bar
    // HTTPQuery: name=bar
    // HTTPQueries: name=[bar]
    @HTTPQuery() name: string,
    @HTTPQueries() names: string[],
  ) {
    return `hello, ${name}`;
  }
}

如果需要使用别名,比如说 query 中的 name 不能在 js 中声明时,如 foobar 这类的。可以通过以下形式

@HTTPQuery({ name: 'foo[bar]' }) fooBar: string,
HTTPParam

接收 path 中的参数,类型只能为 string

// app/controller/FooController.ts
import { Context, EggContext, HTTPController, HTTPMethod, HTTPMethodEnum, HTTPBody } from '@eggjs/tegg';

@HTTPController({
  path: '/foo',
})
export class FooController {
  @HTTPMethod({
    method: HTTPMethodEnum.GET,
    path: '/:id',
  })
  async hello(@HTTPParam() id: string) {
    return `hello, ${name}`;
  }
}

如果需要使用别名,比如说 path 中使用正则声明 /foo/(.*), 可以通过以下形式

// 具体 name 值可以查看 path-to-regexp
@HTTPParam({ name: '0' }) id: string

Host

Host 注解,用于指定 HTTP 方法仅在 host 匹配时执行。 可以添加在类/方法上。添加在类上时,对类上所有方法生效,添加在方法上时,只对当前方法生效。方法上的注解可以覆盖类上的注解

// app/controller/FooController.ts
import { Host } from '@eggjs/tegg';
@Host('foo.eggjs.com')
export class FooController {
  // 仅能通过 foo.eggjs.com 访问
  async hello() {
  }

  // 仅能通过 bar.eggjs.com 访问
  @Host('bar.eggjs.com')
  async bar() {
  }
}

MCP 注解

MCPController/MCPPrompt/MCPTool/MCPResource

@MCPController 注解用来声明当前类是一个 MCP controller。 通过使用装饰器 @MCPPrompt @MCPTool @MCPResource 来声明对应的 MCP 类型。 使用 @ToolArgsSchema @PromptArgsSchema @Extra 来 schema 和 extra。

import {
  MCPController,
  PromptArgs,
  ToolArgs,
  MCPPromptResponse,
  MCPToolResponse,
  MCPResourceResponse,
  MCPPrompt,
  MCPTool,
  MCPResource,
  PromptArgsSchema,
  Logger,
  Inject,
  ToolArgsSchema,
} from '@eggjs/tegg';
import z from 'zod';

export const PromptType = {
  name: z.string(),
};

export const ToolType = {
  name: z.string({
    description: 'npm package name',
  }),
};


@MCPController()
export class McpController {

  @Inject()
  logger: Logger;

  @MCPPrompt()
  async foo(@PromptArgsSchema(PromptType) args: PromptArgs<typeof PromptType>): Promise<MCPPromptResponse> {
    this.logger.info('hello world');
    return {
      messages: [
        {
          role: 'user',
          content: {
            type: 'text',
            text: `Generate a concise but descriptive commit message for these changes:\n\n${args.name}`,
          },
        },
      ],
    };
  }

  @MCPTool()
  async bar(@ToolArgsSchema(ToolType) args: ToolArgs<typeof ToolType>): Promise<MCPToolResponse> {
    return {
      content: [
        {
          type: 'text',
          text: `npm package: ${args.name} not found`,
        },
      ],
    };
  }


  @MCPResource({
    template: [
      'mcp://npm/{name}{?version}',
      {
        list: () => {
          return {
            resources: [
              { name: 'egg', uri: 'mcp://npm/egg?version=4.10.0' },
              { name: 'mcp', uri: 'mcp://npm/mcp?version=0.10.0' },
            ],
          };
        },
      },
    ],
  })
  async car(uri: URL): Promise<MCPResourceResponse> {
    return {
      contents: [{
        uri: uri.toString(),
        text: 'MOCK TEXT',
      }],
    };
  }
}

MCP 地址

MCP controller 完整的实现了 SSE / streamable HTTP / streamable stateless HTTP 三种模式,默认情况下,他们的路径分别是 /mcp/init /mcp/stream /mcp/stateless/stream, 你可以根据你所需要的场景,灵活使用对应的接口。

// config.{env}.ts
import { randomUUID } from 'node:crypto';

export default () => {

  const config = {
    mcp: {
      sseInitPath: '/mcp/init', // SSE path
      sseMessagePath: '/mcp/message', // SSE message path
      streamPath: '/mcp/stream', // streamable path
      statelessStreamPath: '/mcp/stateless/stream', // stateless streamable path
      sessionIdGenerator: randomUUID, 
    },
  };

  return config;
};
3.56.3

6 months ago

3.56.2

6 months ago

3.55.0

6 months ago

3.51.2

11 months ago

3.51.1

12 months ago

3.57.6

5 months ago

3.57.5

5 months ago

3.57.4

5 months ago

3.57.3

5 months ago

3.57.2

5 months ago

3.57.1

5 months ago

3.57.9

5 months ago

3.56.1

6 months ago

3.56.0

6 months ago

3.52.1

7 months ago

3.52.0

10 months ago

4.0.0-beta.4

7 months ago

4.0.0-beta.3

7 months ago

4.0.0-beta.2

8 months ago

4.0.0-beta.1

8 months ago

3.57.0

6 months ago

3.53.0

6 months ago

3.51.0

12 months ago

3.50.1

12 months ago

3.50.0

12 months ago

3.49.0

1 year ago

3.43.0

1 year ago

3.43.1

1 year ago

3.43.2

1 year ago

1.7.8

1 year ago

3.47.0

1 year ago

3.47.2

1 year ago

3.40.0

1 year ago

3.40.1

1 year ago

3.44.0

1 year ago

3.44.1

1 year ago

3.48.0

1 year ago

3.48.1

1 year ago

3.41.0

1 year ago

3.45.0

1 year ago

3.42.0

1 year ago

3.46.0

1 year ago

3.39.5

1 year ago

3.39.4

1 year ago

3.46.1

1 year ago

3.46.2

1 year ago

3.46.3

1 year ago

3.46.4

1 year ago

3.39.1

1 year ago

3.39.2

1 year ago

3.39.3

1 year ago

3.38.0

2 years ago

3.39.0

2 years ago

3.37.3

2 years ago

3.37.0

2 years ago

3.37.1

2 years ago

3.36.3

2 years ago

3.36.2

2 years ago

3.36.1

2 years ago

3.36.0

2 years ago

3.35.0

2 years ago

3.35.1

2 years ago

3.33.0

2 years ago

3.33.1

2 years ago

3.34.0

2 years ago

3.32.0

2 years ago

3.31.0

2 years ago

3.30.1

2 years ago

3.30.0

2 years ago

3.29.0

2 years ago

3.28.2

2 years ago

3.28.1

2 years ago

3.28.0

2 years ago

3.20.0

2 years ago

3.22.0

2 years ago

3.15.0

2 years ago

3.17.0

2 years ago

3.19.0

2 years ago

3.12.0

2 years ago

3.26.0

2 years ago

3.21.0

2 years ago

3.23.0

2 years ago

3.14.1

2 years ago

3.14.0

2 years ago

3.14.3

2 years ago

3.16.0

2 years ago

3.14.2

2 years ago

3.18.1

2 years ago

3.18.0

2 years ago

3.14.4

2 years ago

3.13.0

2 years ago

3.25.1

2 years ago

3.27.0

2 years ago

3.25.2

2 years ago

3.10.0

2 years ago

3.11.0

2 years ago

3.11.1

2 years ago

3.9.0

2 years ago

3.8.0

2 years ago

3.6.2

3 years ago

3.6.1

3 years ago

3.6.0

3 years ago

1.7.7

3 years ago

3.6.3

3 years ago

3.7.0

3 years ago

3.5.2

3 years ago

3.5.1

3 years ago

3.5.0

3 years ago

3.0.0-alpha.0

3 years ago

3.4.0

3 years ago

3.2.2

3 years ago

3.2.1

3 years ago

3.2.0

3 years ago

3.2.4

3 years ago

3.4.1

3 years ago

3.2.3

3 years ago

3.0.0

3 years ago

1.7.6

3 years ago

1.7.5

3 years ago

1.7.4

3 years ago

1.7.3

3 years ago

1.7.2

3 years ago

3.3.1

3 years ago

3.3.0

3 years ago

3.1.0

3 years ago

3.3.4

3 years ago

3.3.3

3 years ago

3.3.2

3 years ago

1.7.1

3 years ago

1.5.3

3 years ago

1.7.0

3 years ago

1.6.1

3 years ago

1.6.0

3 years ago

1.2.0

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.5.2

3 years ago

1.5.1

3 years ago

1.3.3

3 years ago

1.5.0

3 years ago

1.4.1

3 years ago

1.3.2

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago

1.0.5

3 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

1.0.4

4 years ago

0.2.0

4 years ago

0.1.18

4 years ago

0.1.19

4 years ago

0.1.14

4 years ago

0.1.15

4 years ago

0.1.16

4 years ago

0.1.12

4 years ago

0.1.13

4 years ago

0.1.10

4 years ago

0.1.8

4 years ago

0.1.9

4 years ago

0.1.7

4 years ago

0.1.6

4 years ago

0.1.5

4 years ago

0.1.4

4 years ago

0.1.3

4 years ago

0.1.1

4 years ago

0.1.0

4 years ago