作者:小菜一蝶2502902341 | 来源:互联网 | 2024-12-13 10:37
最近在构建一个基于Koa的简单静态文件服务器时遇到了一个问题:需要确保在调用app.listen(port)
方法监听特定端口之前,该端口未被其他服务占用。这是因为,在应用的生命周期中,可能会有多次尝试启动服务的情况,如果不检查端口占用状态,可能会导致程序异常或失败。
为了解决这一问题,可以通过尝试连接目标端口来检测其是否可用。如果连接失败,则说明端口是可用的;反之,如果连接成功,则表明端口已被占用,此时应采取相应措施避免重复启动服务或选择其他可用端口。
以下是经过调整后的代码示例,其中包含了端口占用检测功能:
import Koa from 'koa';
import path from 'path';
import koaStatic from 'koa-static';
import bodyParser from 'koa-bodyparser';
import Router from 'koa-router';
import cors from '@koa/cors'; // 开发期间允许跨域
import net from 'net';
import Database from '../database/index';
const app = new Koa();
const router = new Router();
let server;
let data;
let dataFile;
// 允许跨域请求
app.use(cors());
// 配置静态文件服务
const staticPath = './static';
app.use(koaStatic(path.join(__dirname, staticPath)));
// 解析请求体
app.use(bodyParser());
// 定义路由处理函数
const submit = async (ctx) => {
console.log(ctx.request.body);
ctx.response.body = {
success: true,
message: '数据提交成功'
};
const newData = {
content: ctx.request.body
};
Database.insert(dataFile, newData);
};
const fetchData = async (ctx) => {
console.log(data);
ctx.response.body = data;
};
const findData = async (ctx) => {
const { staname } = ctx.params;
console.log('收到查询请求');
console.log(staname);
try {
const result = await Database.findStaByName(staname);
console.log(result);
ctx.response.body = result;
} catch (error) {
console.error(error);
ctx.response.status = 500;
ctx.response.body = { error: '查询失败' };
}
};
router.post('/api/submit', submit);
router.get('/api/fetchData', fetchData);
router.get('/api/findData/:staname', findData);
app.use(router.routes()).use(router.allowedMethods());
// 检查端口是否被占用
function checkPortAvailability(port, callback) {
const server = net.createServer().listen(port);
server.on('listening', () => {
server.close();
callback(null, true);
});
server.on('error', (err) => {
if (err.code === 'EADDRINUSE') {
callback(new Error(`端口 ${port} 已被占用`), false);
} else {
callback(err, false);
}
});
}
// 启动服务
function startServer(arg1) {
const targetPort = 5050;
checkPortAvailability(targetPort, (err, available) => {
if (err) {
console.error(err.message);
} else if (available) {
server = app.listen(targetPort, () => {
console.log(`服务已启动,监听端口 ${targetPort}`);
});
data = arg1;
} else {
console.log(`端口 ${targetPort} 已被占用,无法启动服务。`);
}
});
}
// 停止服务
function stopServer() {
if (server) {
server.close(() => {
console.log('服务已停止');
});
}
}
export default {
startServer,
stopServer
};
上述代码中,我们新增了一个checkPortAvailability
函数,用于在启动服务前检测端口是否可用。此外,还对原有的startServer
函数进行了修改,使其在调用app.listen
之前先执行端口检测逻辑。
关于Koa的详细API文档,官方文档是一个非常好的资源,可以从Koa官网获取。此外,GitHub上的Koa仓库也提供了丰富的文档和示例,对于深入理解和使用Koa非常有帮助。