// server.js const express = require('express'); const bodyParser = require('body-parser'); const morgan = require('morgan'); const logger = require('./logger'); const { getTripleByMac, publishToIot } = require('./aliyun-iot'); // 改为手动设置环境变量(或从命令行传入) process.env.PORT = process.env.PORT || 13000; process.env.IOT_REGION = 'cn-shanghai'; const app = express(); const PORT = process.env.PORT || 13000; // 日志中间件 app.use(morgan('combined', { stream: { write: (msg) => logger.info(msg.trim()) } })); // 解析 JSON app.use(bodyParser.json()); // 接收设备数据 app.post('/api/message', async (req, res) => { const { MAC, IP, DataBase } = req.body; console.log(req.body); if (!MAC || !IP || !DataBase) { return res.status(400).json({ success: false, message: '缺少必要字段: MAC, ip, data' }); } const logMeta = { deviceMac: MAC, deviceIp: IP }; logger.info(` 收到设备数据`, logMeta); try { // 1. 获取三元组 const triple = await getTripleByMac(MAC); // 2. 转发数据到阿里云 IoT publishToIot(triple, DataBase,logMeta); res.status(200).json({ success: true, message: '数据接收并转发成功', deviceId: `${triple.productKey}/${triple.deviceName}` }); } catch (error) { logger.error(`处理数据失败`, { ...logMeta, error: error.message }); res.status(500).json({ success: false, message: '内部错误' }); } }); // 健康检查 app.get('/health', (req, res) => { res.json({ status: 'OK', clients: deviceClients?.size || 0, cacheSize: tripleCache?.size || 0, timestamp: new Date().toISOString() }); }); // 启动服务 app.listen(PORT, () => { logger.info(`透析机数据服务启动`, { port: PORT }); });