aomex,它只不过是个node.js框架

541 阅读2分钟

安装

它居然需要执行一个命令才能安装成功,太慢了

npx create-aomex@latest

路由

最基础的路由,不过就是帮你做参数守卫,顺便搞个类型提示

import { rule } from '@aomex/core';
import { Router, query } from '@aomex/web';

export const router = new Router({ prefix: '/users' });

router.get('/', {
  mount: [
    query({
      page: rule.int().min(1).default(1),
      size: rule.int().min(5).max(100).default(10),
    }),
  ],
  action: async (ctx) => {
    const { page, size } = ctx.query;
    const users = await logic.getUsers(page, size);
    ctx.send(users);
  }
});

image.png

完整点的路由,顶多就是加个响应的内容,让你的swagger文档丰满一些,顺便做个类型提示

router.get('/', {
  mount: [
    query({
      page: rule.int().min(1).default(1),
      size: rule.int().min(5).max(100).default(10),
    }),
    response({
      statusCode: 200,
      content: rule.array({
        id: rule.int(),
        name: rule.string(),
        age: rule.int().nullable(),
      }),
    }),
  ],
  action: async (ctx) => {
    const { page, size } = ctx.query;
    const users = await logic.getUsers(page, size);
    ctx.send(users);
  }
});

image.png

这...是要我与bug做个了断?测试的KPI又无法达标了?


最离谱的是,导出的路由根本就不知道要用在哪里,只能挂一个中间件自动搜索路由,这让我损失了很多低级乐趣。

import { routers, WebApp } from '@aomex/web';

const app = new WebApp({
+ mount: [routers('./src/routers')]
});

app.listen(3000);

文档

写完接口,我刚想着怎么和前端同学对接的时候,它很不负责任地扔给我一个swagger插件,然后打算让我把地址发给那个同学,我并没有当回事。

import { swaggerUI } from '@aomex/swagger-ui';
import { generateOpenapi } from '@aomex/openapi';
import { WebApp, routers } from '@aomex/web';

const app = new WebApp({
  mount: [
+   swaggerUI({
+     openapi: () => generateOpenapi({ routers: './src/routers' }),
+   }),
    routers('./src/routers'),
  ],
});

app.listen(3000);

不过就是生成了一个http://localhost:3000/swagger文档地址?就这?下次再不搞个好看点的UI插件,看我怎么揍死你😠 image.png

请求服务

该死,前端同学说swagger的UI太丑,没有打开看的欲望,我也是服了,抠抠搜搜地掏出一个不要钱的请求服务库悄悄给前端同学装上

// openapi.config.ts
import { defineConfig } from 'foca-openapi';

export default defineConfig({
  path: 'http://localhost:3000/swagger/openapi.json',
  classMode: 'rpc-group',
});

然后免费帮他执行了一下指令

npx openapi

他就可以放心地使用了。要不是领导在催进度,我才懒得管这事

image.png image.png image.png

指令

所谓的指令,不知道的还以为是在写接口,偶尔接收一下参数,简直就是废物

import { rule } from '@aomex/core';
import { Commander, options } from '@aomex/console';

export const commander = new Commander();

commander.create('say:hello', {
  docs: { summary: '打招呼' },
  mount: [
    options({
      name: rule.string().default('World'),
    }),
  ],
  action: (ctx) => {
    const { name } = ctx.options;
    console.log(`Hello ${name}`);
  },
});

image.png 也没告诉我写完咋执行,真的是菜得不要不要的。还要我自己先看看帮助指令

npx aomex -h

image.png 朕知道了,退下吧!

npx aomex say:hello

Hello World

又是特么的hello world,每天学习新编程语言都hello吐了🤮。我要hello,树先生!

npx aomex say:hello -h

image.png 安排

npx aomex say:hello --name ",树先生!"

等等!我真是服了,这显示的帮助信息居然是中文,这太不国际范了吧?以后还怎么装逼。

import { commanders, ConsoleApp } from '@aomex/console';

const app = new ConsoleApp({
+ language: 'en_US',
  mount: [commanders('./src/commanders')],
});

const code = await app.run();
process.exit(code);

image.png 你小子挺会玩...这次先放过你。

定时任务

我不喜欢直接跟人打招呼,所以这个招呼如果非打不可,那么可以等我离开后再放出来吗?嗖~又特么扔给我个什么插件?

import { rule } from '@aomex/core';
import { Commander, options } from '@aomex/console';
import { cron } from '@aomex/cron';

export const commander = new Commander();

commander.create('say:hello', {
  docs: { summary: '打招呼' },
  mount: [
+   cron({ minute: '*/5', args: ['树先生'] }),
+   cron({ month: '5,11', args: ['牛夫人'] }),
+   cron({ second: '*/2', args: ['小甜甜'] }),
    options({
      name: rule.string().default('World'),
    }),
  ],
  action: (ctx) => {
    const { name } = ctx.options;
    console.log(`Hello ${name}`);
  },
});

我走了,开始打招呼吧

npx aomex cron:start

真他娘的人才,小甜甜每隔2秒钟问候一次,牛夫人半年才问候一次。别说我认识你这个负心汉。

我看看你还跟谁打招呼了:

# npx aomex cron:eject
*/5 * * * * aomex say:hello 树先生
* * * 5,11 * aomex say:hello 牛夫人
*/2 * * * * * aomex say:hello 小甜甜

仓库

服了,讲这么久还没告诉我项目地址。
github.com/aomex/aomex

文档是不是也没写?哦,写了,当我没问
aomex.js.org