Browse Source

修复服务器端错误处理并添加健康检查端点

master
Default User 1 month ago
parent
commit
64d59a5f33
  1. 168
      server.js

168
server.js

@ -36,6 +36,46 @@ async function testDbConnection() {
testDbConnection(); testDbConnection();
const server = http.createServer(async (req, res) => { const server = http.createServer(async (req, res) => {
// 健康检查端点
if (req.method === 'GET' && req.url === '/health') {
try {
// 测试数据库连接
const [rows] = await pool.execute('SELECT 1');
// 测试OSS连接
const ossStatus = await OssUploader.testConnection();
res.writeHead(200, {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
});
res.end(JSON.stringify({
success: true,
status: 'healthy',
database: 'connected',
oss: ossStatus.success ? 'connected' : 'disconnected',
timestamp: new Date().toISOString()
}));
} catch (error) {
console.error('健康检查失败:', error.message);
res.writeHead(503, {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
});
res.end(JSON.stringify({
success: false,
status: 'unhealthy',
error: error.message,
timestamp: new Date().toISOString()
}));
}
return;
}
// 处理GET请求,获取最新的合格证信息 // 处理GET请求,获取最新的合格证信息
if (req.method === 'GET' && req.url === '/getLatestCertificate') { if (req.method === 'GET' && req.url === '/getLatestCertificate') {
try { try {
@ -76,60 +116,84 @@ const server = http.createServer(async (req, res) => {
}); });
req.on('end', async () => { req.on('end', async () => {
// 解析表单数据 try {
const formData = new URLSearchParams(body); // 解析表单数据
const certificate = { const formData = new URLSearchParams(body);
subjectName: formData.get('subjectName'), const certificate = {
contact: formData.get('contact'), subjectName: formData.get('subjectName'),
productName: formData.get('productName'), contact: formData.get('contact'),
weight: formData.get('weight'), productName: formData.get('productName'),
basis: formData.get('basis'), weight: formData.get('weight'),
origin: formData.get('origin'), basis: formData.get('basis'),
date: formData.get('date'), origin: formData.get('origin'),
signature: formData.get('signature') date: formData.get('date'),
}; signature: formData.get('signature')
};
// 处理手写签名,上传到OSS
let signatureUrl = null; console.log('接收到的表单数据:', {
if (certificate.signature) { subjectName: certificate.subjectName,
try { contact: certificate.contact,
// 从base64字符串中提取图片数据 productName: certificate.productName,
const base64Data = certificate.signature.replace(/^data:image\/png;base64,/, ''); weight: certificate.weight,
const buffer = Buffer.from(base64Data, 'base64'); basis: certificate.basis,
origin: certificate.origin,
// 生成唯一的文件名,包含合格证信息的标识 date: certificate.date,
const timestamp = Date.now(); hasSignature: !!certificate.signature
const filename = `certificate_signature_${timestamp}.png`; });
// 上传到OSS,指定文件夹为certificate/signatures // 处理手写签名,上传到OSS
signatureUrl = await OssUploader.uploadBuffer(buffer, filename, 'certificate/signatures', 'image'); let signatureUrl = null;
console.log('手写签名上传到OSS成功:', signatureUrl); if (certificate.signature) {
} catch (error) { try {
console.error('上传手写签名到OSS失败:', error.message); // 从base64字符串中提取图片数据
// 即使上传失败,也继续处理,将签名数据存储为base64 const base64Data = certificate.signature.replace(/^data:image\/png;base64,/, '');
signatureUrl = certificate.signature; const buffer = Buffer.from(base64Data, 'base64');
// 生成唯一的文件名,包含合格证信息的标识
const timestamp = Date.now();
const filename = `certificate_signature_${timestamp}.png`;
// 上传到OSS,指定文件夹为certificate/signatures
signatureUrl = await OssUploader.uploadBuffer(buffer, filename, 'certificate/signatures', 'image');
console.log('手写签名上传到OSS成功:', signatureUrl);
} catch (error) {
console.error('上传手写签名到OSS失败:', error.message);
// 即使上传失败,也继续处理,将签名数据存储为base64
signatureUrl = certificate.signature;
}
} }
}
// 插入数据到数据库 // 插入数据到数据库
await pool.execute( await pool.execute(
'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', 'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl] [certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl]
); );
// 返回成功响应,确保返回的signature是OSS URL console.log('数据插入数据库成功');
const responseCertificate = {
...certificate, // 返回成功响应,确保返回的signature是OSS URL
signature: signatureUrl const responseCertificate = {
}; ...certificate,
signature: signatureUrl
res.writeHead(200, { };
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*', res.writeHead(200, {
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', 'Content-Type': 'application/json',
'Access-Control-Allow-Headers': 'Content-Type' 'Access-Control-Allow-Origin': '*',
}); 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
res.end(JSON.stringify({ success: true, certificate: responseCertificate })); 'Access-Control-Allow-Headers': 'Content-Type'
});
res.end(JSON.stringify({ success: true, certificate: responseCertificate }));
} catch (error) {
console.error('处理表单数据失败:', error.message);
res.writeHead(500, {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
});
res.end(JSON.stringify({ success: false, error: '处理数据失败,请重试' }));
}
}); });
} catch (error) { } catch (error) {
console.error('保存合格证信息失败:', error.message); console.error('保存合格证信息失败:', error.message);

Loading…
Cancel
Save