require('dotenv').config();
|
const path = require('path');
|
const express = require('express');
|
const axios = require('axios');
|
const { sign } = require('./sign');
|
|
const app = express();
|
const port = Number(process.env.TEST_CLIENT_PORT || 3000);
|
|
app.use(express.json({ limit: '1mb' }));
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
app.get('/api/defaults', (req, res) => {
|
res.json({
|
targetUrl: process.env.DEFAULT_TARGET_URL || 'http://womp.jsbogang.com/v1/weight/report',
|
clientId: process.env.DEFAULT_CLIENT_ID || '10001',
|
secret: process.env.DEFAULT_SECRET || '9001ac9676b8',
|
gpsTargetUrl: process.env.DEFAULT_GPS_TARGET_URL || '',
|
});
|
});
|
|
app.post('/api/send', async (req, res) => {
|
try {
|
const {
|
targetUrl,
|
clientId,
|
secret,
|
deviceNo,
|
uploadTime,
|
garbageType,
|
garbageWeight,
|
others,
|
} = req.body || {};
|
|
if (!targetUrl || !clientId || !secret || !deviceNo || !uploadTime || !garbageType || !garbageWeight) {
|
return res.status(400).json({
|
ok: false,
|
msg: '缺少必填字段:targetUrl/clientId/secret/deviceNo/uploadTime/garbageType/garbageWeight',
|
});
|
}
|
|
if (others) {
|
try {
|
JSON.parse(others);
|
} catch (err) {
|
return res.status(400).json({ ok: false, msg: 'others 必须是合法 JSON 字符串' });
|
}
|
}
|
|
const signed = sign(clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret);
|
const requestBody = {
|
deviceNo: String(deviceNo),
|
uploadTime: String(uploadTime),
|
garbageType: String(garbageType),
|
garbageWeight: String(garbageWeight),
|
};
|
if (others) {
|
requestBody.others = String(others);
|
}
|
|
let responsePayload = null;
|
let httpStatus = null;
|
let networkError = null;
|
|
try {
|
const response = await axios.post(targetUrl, requestBody, {
|
headers: {
|
'Content-Type': 'application/json',
|
clientId: String(clientId),
|
sign: signed.sign,
|
},
|
timeout: 15000,
|
validateStatus: () => true,
|
});
|
httpStatus = response.status;
|
responsePayload = response.data;
|
} catch (err) {
|
networkError = err.message;
|
}
|
|
return res.json({
|
ok: !networkError,
|
signString: signed.signString,
|
sign: signed.sign,
|
requestHeaders: {
|
clientId: String(clientId),
|
sign: signed.sign,
|
},
|
requestBody,
|
httpStatus,
|
response: responsePayload,
|
networkError,
|
});
|
} catch (err) {
|
return res.status(500).json({ ok: false, msg: err.message });
|
}
|
});
|
|
app.post('/api/send-gps', async (req, res) => {
|
try {
|
const { targetUrl, payload } = req.body || {};
|
|
if (!targetUrl) {
|
return res.status(400).json({ ok: false, msg: '缺少目标地址 targetUrl' });
|
}
|
if (!payload || typeof payload !== 'object') {
|
return res.status(400).json({ ok: false, msg: '缺少合法 JSON payload' });
|
}
|
|
let responsePayload = null;
|
let httpStatus = null;
|
let networkError = null;
|
|
try {
|
const response = await axios.post(targetUrl, payload, {
|
headers: { 'Content-Type': 'application/json' },
|
timeout: 15000,
|
validateStatus: () => true,
|
});
|
console.log(response.data)
|
httpStatus = response.status;
|
responsePayload = response.data;
|
} catch (err) {
|
networkError = err.message;
|
}
|
|
return res.json({
|
ok: !networkError,
|
requestBody: payload,
|
httpStatus,
|
response: responsePayload,
|
networkError,
|
});
|
} catch (err) {
|
return res.status(500).json({ ok: false, msg: err.message });
|
}
|
});
|
|
app.listen(port, '0.0.0.0', () => {
|
console.log(`测试客户端已启动: http://localhost:${port}`);
|
});
|