sword在server端的实现,是使用插件实现的,我们可以在这里实现一个server插件,并且注册到server root节点上。

  1. import { createServer } from 'http';
  2. import net from 'net';
  3. import { log } from '@swordjs/sword-plugin-log';
  4. import type { Plugin } from '../../../typings/index';
  5. type ServerConfig = {
  6. port?: number;
  7. };
  8. const defaultServerConfig: ServerConfig = {
  9. port: 3000
  10. };
  11. /**
  12. * 开启服务器
  13. * @platform web
  14. * @param {App} app
  15. * @param {ServerConfig} [serverConfig=defaultServerConfig]
  16. */
  17. const startServer = async (app: any, serverConfig: ServerConfig = defaultServerConfig): Promise<void> => {
  18. let key: keyof ServerConfig;
  19. for (key in serverConfig) {
  20. if (!serverConfig[key]) {
  21. serverConfig[key] = defaultServerConfig[key];
  22. }
  23. }
  24. // 启动服务器
  25. const start = () => {
  26. log.info(`HTTP服务启动中...`);
  27. const server = createServer(app);
  28. try {
  29. // 判断
  30. server.listen(serverConfig.port);
  31. log.success(`程序运行在${serverConfig.port}端口上`);
  32. } catch (error) {
  33. log.err(JSON.stringify(error));
  34. }
  35. };
  36. // 尝试检测port被占用情况
  37. const tryUsePort = async (): Promise<any> => {
  38. // 查看端口是否占用
  39. const used = await portUsed(serverConfig.port as number);
  40. if (used === false) {
  41. // 如果端口被占用,就把port++
  42. serverConfig.port && serverConfig.port++;
  43. return await tryUsePort();
  44. } else {
  45. // 没有被占用返回true
  46. return true;
  47. }
  48. };
  49. if (await tryUsePort()) {
  50. // port合法
  51. start();
  52. }
  53. };
  54. // 端口是否使用
  55. const portUsed = (port: number): Promise<number | false> => {
  56. return new Promise((resolve) => {
  57. const server = net.createServer().listen(port);
  58. server.on('listening', function () {
  59. server.close();
  60. resolve(port);
  61. });
  62. server.on('error', function (err: any) {
  63. if (err.code == 'EADDRINUSE') {
  64. resolve(false);
  65. }
  66. });
  67. });
  68. };
  69. export const useServer = (): Plugin => {
  70. return {
  71. name: 'server',
  72. server: {
  73. start: startServer
  74. }
  75. };
  76. };

我们导出了一个函数名为useServer,我们就可以在server中直接使用,在这里只是一个demo,因为sword内置已经支持了这个插件,现在我们可以使用server插件

  1. const plugin = usePlugin();
  2. plugin.add(useServer);

类型

  1. server?: {
  2. start: (...args: any[]) => Promise<void> | void;
  3. };