林安随笔 - node
type: channel
link: https://www.yuaq.cn/index.php/tag/node/
items: nodejs搭建服务器+连接数据库+接口开发
items: txt文件报文解析写入excel

nodejs搭建服务器+连接数据库+接口开发
type: item
date: 2023-12-02T14:15:00+08:00
description: 1. 创建项目文件，然后执行初始化命令（会生成package.json项目描述文件，记录项目的信息，安装依赖包信息、相关命令等）node init -y2. 安装需要的依赖包/* * express: 快速搭建服务器 对于nodejs中http模块的进一步封装 * nodemon: 热重载 * cors: 处理跨域 * @hapi/joi: 请求数据进行验证 * @escook/express-joi: 表单数据进行验证 * express-jwt：解析 Token * mysql：数据库 * bcryptjs：非对称加密 * jsonwebtoken：生成 Token 字符串 */ npm add express nodemon cors @hapi/joi@17.1.0 @escook/express-joi express-jwt jsonwebtoken mysql3. 项目结构│ config.js │ index.js │ package-lock.json │ package.json │ ├─db │ index.js │ ├─routerHandle │ user.js │ userinfo.js │ ├─routers │ user.js │ userinfo.js │ └─schema user.js4. 执行文件 index.js// 导入模块 const express = require('express'); const cors = require('cors'); // 导入定义验证规则的包 const joi = require('joi'); const app = express(); app.use(cors()); app.use(express.json()) // 解析表单中json数据，不配置的情况下，req.body默认为undefined app.use(express.urlencoded({ extended: false })) // 解析表单中url-encoded数据，不配置的情况下，req.body默认为 {} // 失败响应方法中间件 app.use((req, res, next) => { res.cc = (status, err) => { res.send({ status, message: err instanceof Error ? err.message : err }) } next() }) // 路由之前声明中间件 // token 解析中间件 const expressJWT = require('express-jwt') const config = require('./config') app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api/] })) // 导入用户登录注册路由模块 const userRouter = require('./routers/user') app.use('/api', userRouter) // 导入用户信息路由模块 const userInfoRouter = require('./routers/userinfo') app.use('/my', userInfoRouter) // 错误级别中间件，需放在所有路由最后 app.use((err, req, res, next) => { // 表单验证失败 if (err instanceof joi.ValidationError) return res.cc(400, err) // 身份认证失败 if (err.name === 'UnauthorizedError') return res.cc(401, '身份认证失败') res.cc(400, err) }) // 启动服务 app.listen(8081, () => { console.log('Server is running..., http://127.0.0.1'); })5. 数据库文件 db/index.jsconst mysql = require('mysql') const db = mysql.createPool({ host: '127.0.0.1', user: 'root', password: '123456', database: 'text' }) module.exports = db6. 登录注册路由模块 routers/user// 导入模块 const express = require('express'); const rou…

txt文件报文解析写入excel
type: item
date: 2023-12-01T10:50:00+08:00
description: 实现思路：文件夹（datalog）下面有多个文件夹（20231123），下面是log.txt，循环遍历获取到log.txt，用split切割为数组，然后使用正则匹配代码对应的参数值，存放在数组中，最后写入excel│ TxtToExcel.js │ ├─dataLog │ │ HJ 212-2017 污染物在线监控（监测）系统数据传输标准.pdf │ │ │ ├─20231128 │ │ log.txt │ │ │ └─20231129 │ log.txt │代码：// 引入模块 const fs = require('fs'); const path = require('path'); const XLSX = require('xlsx') // 正则匹配 let typeHregex = /CN=(2061);/; // 小时数据 let type5Mregex = /CN=(2051);/; // 5分钟数据 let type1Mregex = /CN=(2011);/; // 1分钟数据 let Tregex = /DataTime=(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; // 时间 let MN = /MN=(.*?);/; // 设备MN号 let PM10regex = /a34002-Avg=(.*?),/; let PM10regex1 = /a34002-Rtd=(.*?),/; let PM25regex = /a34004-Avg=(.*?),/; let PM25regex1 = /a34004-Rtd=(.*?),/; let Tspregex = /a34001-Avg=(.*?),/; // 悬浮颗粒物 let Wdregex = /a01001-Avg=(.*?),/; // 温度 let Sdregex = /a01002-Avg=(.*?),/; // 湿度 let Fsregex = /a01007-Avg=(.*?),/; // 风速 let Fxregex = /a01008-Avg=(.*?),/; // 风向 let Qyregex = /a01006-Avg=(.*?),/; // 气压 let SO2regex = /a21026-Avg=(.*?),/; // 二氧化硫 let SO2regex1 = /a21026-Rtd=(.*?),/; // 二氧化硫 let Coregex = /a21005-Avg=(.*?),/; // 一氧化碳 let Coregex1 = /a21005-Rtd=(.*?),/; // 一氧化碳 let NO2regex = /a21004-Avg=(.*?),/; // 二氧化氮 let NO2regex1 = /a21004-Rtd=(.*?),/; // 二氧化氮 let O3regex = /a05024-Avg=(.*?),/; // 臭氧 let O3regex1 = /o31104-Avg=(.*?),/; // 臭氧 let O3regex2 = /a05024-Rtd=(.*?),/; // 臭氧 let O3regex3 = /ac0001-Rtd=(.*?),/; // 臭氧 // 将JSON对象写入Excel function writeArrayToExcel(arrayData, fileName) { // 创建一个工作簿 let WorkSheet = XLSX.utils.aoa_to_sheet(arrayData); // 创建一个工作表 let new_workbook = XLSX.utils.book_new(); // 将数组数据写入工作表 XLSX.utils.book_append_sheet(new_workbook, WorkSheet, '第一页'); // 将工作簿写入文件 try { XLSX.writeFile(new_workbook, fileName) console.log('写入文件成功!') } catch (err) { console.log('写入文件失败!' + err) } } // 解析结果表头 let fileDataList = [[ '采样时间', '设备mn号', 'PM10', 'PM25', '二氧化硫SO2', '一氧化碳CO', '二氧化氮NO2', '臭氧O3', '悬浮颗粒物', '温度', '湿度', '风速', '风向', '气压', ]] // 正则解析 const jxFun = (item, typeRegex, mnValue) => { let result = Tre…