sword在server端的实现,是使用插件实现的,我们可以在这里实现一个server插件,并且注册到server root节点上。
import { createServer } from 'http';import net from 'net';import { log } from '@swordjs/sword-plugin-log';import type { Plugin } from '../../../typings/index';type ServerConfig = {port?: number;};const defaultServerConfig: ServerConfig = {port: 3000};/*** 开启服务器* @platform web* @param {App} app* @param {ServerConfig} [serverConfig=defaultServerConfig]*/const startServer = async (app: any, serverConfig: ServerConfig = defaultServerConfig): Promise<void> => {let key: keyof ServerConfig;for (key in serverConfig) {if (!serverConfig[key]) {serverConfig[key] = defaultServerConfig[key];}}// 启动服务器const start = () => {log.info(`HTTP服务启动中...`);const server = createServer(app);try {// 判断server.listen(serverConfig.port);log.success(`程序运行在${serverConfig.port}端口上`);} catch (error) {log.err(JSON.stringify(error));}};// 尝试检测port被占用情况const tryUsePort = async (): Promise<any> => {// 查看端口是否占用const used = await portUsed(serverConfig.port as number);if (used === false) {// 如果端口被占用,就把port++serverConfig.port && serverConfig.port++;return await tryUsePort();} else {// 没有被占用返回truereturn true;}};if (await tryUsePort()) {// port合法start();}};// 端口是否使用const portUsed = (port: number): Promise<number | false> => {return new Promise((resolve) => {const server = net.createServer().listen(port);server.on('listening', function () {server.close();resolve(port);});server.on('error', function (err: any) {if (err.code == 'EADDRINUSE') {resolve(false);}});});};export const useServer = (): Plugin => {return {name: 'server',server: {start: startServer}};};
我们导出了一个函数名为useServer,我们就可以在server中直接使用,在这里只是一个demo,因为sword内置已经支持了这个插件,现在我们可以使用server插件
const plugin = usePlugin();plugin.add(useServer);
类型
server?: {start: (...args: any[]) => Promise<void> | void;};
