163 lines
4.7 KiB
Django/Jinja
163 lines
4.7 KiB
Django/Jinja
|
|
// Node.js HTTP服务包装器
|
|
|
|
const http = require('http');
|
|
const url = require('url');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// 服务配置
|
|
const HOST = process.env.HOST || '{{host}}';
|
|
const PORT = process.env.PORT || {{port}};
|
|
const TIMEOUT = process.env.TIMEOUT || {{timeout}};
|
|
|
|
// 尝试导入算法模块
|
|
let algorithmModule = null;
|
|
try {
|
|
// 根据入口点导入算法
|
|
if ("{{entry_point}}" === "") {
|
|
// 尝试导入主要模块
|
|
algorithmModule = require('./algorithm');
|
|
} else {
|
|
// 导入入口点
|
|
algorithmModule = require('./{{entry_point}}');
|
|
}
|
|
console.log('算法模块导入成功');
|
|
} catch (e) {
|
|
console.error('算法模块导入失败:', e);
|
|
algorithmModule = null;
|
|
}
|
|
|
|
/**
|
|
* 调用算法
|
|
* @param {Object} requestData 请求数据
|
|
* @returns {Object} 算法执行结果
|
|
*/
|
|
function callAlgorithm(requestData) {
|
|
if (!algorithmModule) {
|
|
throw new Error('算法模块未加载');
|
|
}
|
|
|
|
// 尝试调用算法的主要函数
|
|
try {
|
|
if (algorithmModule.predict) {
|
|
return algorithmModule.predict(requestData);
|
|
} else if (algorithmModule.run) {
|
|
return algorithmModule.run(requestData);
|
|
} else if (algorithmModule.main) {
|
|
return algorithmModule.main(requestData);
|
|
} else {
|
|
throw new Error('未找到算法执行函数');
|
|
}
|
|
} catch (e) {
|
|
throw new Error(`算法执行失败: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处理请求
|
|
* @param {http.IncomingMessage} req 请求对象
|
|
* @param {http.ServerResponse} res 响应对象
|
|
*/
|
|
function handleRequest(req, res) {
|
|
const parsedUrl = url.parse(req.url, true);
|
|
const pathname = parsedUrl.pathname;
|
|
|
|
// 设置响应头
|
|
res.setHeader('Content-Type', 'application/json');
|
|
|
|
if (req.method === 'GET') {
|
|
if (pathname === "{{health_check_path}}") {
|
|
// 健康检查
|
|
res.writeHead(200);
|
|
res.end(JSON.stringify({ status: 'healthy', service: '{{project_name}}' }));
|
|
} else if (pathname === '/info') {
|
|
// 服务信息
|
|
const info = {
|
|
service: '{{project_name}}',
|
|
version: '1.0.0',
|
|
host: HOST,
|
|
port: PORT,
|
|
timeout: TIMEOUT,
|
|
algorithm_loaded: algorithmModule !== null
|
|
};
|
|
res.writeHead(200);
|
|
res.end(JSON.stringify(info));
|
|
} else {
|
|
// 404响应
|
|
res.writeHead(404);
|
|
res.end(JSON.stringify({ error: 'Not Found' }));
|
|
}
|
|
} else if (req.method === 'POST') {
|
|
let body = '';
|
|
|
|
// 读取请求体
|
|
req.on('data', chunk => {
|
|
body += chunk.toString();
|
|
});
|
|
|
|
req.on('end', () => {
|
|
try {
|
|
// 解析请求数据
|
|
const requestData = JSON.parse(body);
|
|
|
|
// 记录请求开始时间
|
|
const startTime = Date.now();
|
|
|
|
// 调用算法
|
|
const result = callAlgorithm(requestData);
|
|
|
|
// 计算响应时间
|
|
const responseTime = (Date.now() - startTime) / 1000;
|
|
|
|
// 构建响应
|
|
const response = {
|
|
success: true,
|
|
result: result,
|
|
response_time: responseTime.toFixed(4),
|
|
message: '算法执行成功'
|
|
};
|
|
|
|
// 发送响应
|
|
res.writeHead(200);
|
|
res.end(JSON.stringify(response));
|
|
} catch (e) {
|
|
// 构建错误响应
|
|
const errorResponse = {
|
|
success: false,
|
|
error: e.message,
|
|
message: '算法执行失败'
|
|
};
|
|
|
|
// 发送错误响应
|
|
res.writeHead(400);
|
|
res.end(JSON.stringify(errorResponse));
|
|
}
|
|
});
|
|
} else {
|
|
// 不支持的方法
|
|
res.writeHead(405);
|
|
res.end(JSON.stringify({ error: 'Method Not Allowed' }));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 启动服务
|
|
*/
|
|
function startServer() {
|
|
const server = http.createServer(handleRequest);
|
|
|
|
server.listen(PORT, HOST, () => {
|
|
console.log(`服务启动成功,监听地址: ${HOST}:${PORT}`);
|
|
console.log(`健康检查地址: http://${HOST}:${PORT}{{health_check_path}}`);
|
|
console.log(`服务信息地址: http://${HOST}:${PORT}/info`);
|
|
});
|
|
|
|
server.on('error', (error) => {
|
|
console.error('服务启动失败:', error);
|
|
});
|
|
}
|
|
|
|
// 启动服务
|
|
startServer();
|