无需数据库在Raspbian系统存储串口名供Node.js调用并支持远程修改
既然你不想用数据库(毕竟只是单条串口名称记录),在Raspbian环境下有几个非常轻量的方案,完全满足需求,下面给你详细拆解:
方案1:本地配置文件(最推荐,灵活易实现)
直接用一个简单的JSON或纯文本文件存在Raspbian本地,Node.js可以直接读写,同时做个极简的HTTP接口来支持远程修改,不需要任何额外服务。
步骤1:创建配置文件
在你的Node.js项目根目录下建一个serial-config.json,内容如下:
{ "portName": "COM7" }
如果追求极致简洁,也可以建serial-port.txt,里面只写COM7即可,读写代码会更简单。
步骤2:Node.js读取配置
const fs = require('fs').promises; const path = require('path'); // 读取串口名称 async function getSerialPort() { try { const configPath = path.join(__dirname, 'serial-config.json'); const data = await fs.readFile(configPath, 'utf8'); const config = JSON.parse(data); return config.portName; } catch (err) { // 文件不存在时返回默认值 console.error('读取配置失败:', err); return 'COM7'; } } // 调用示例 getSerialPort().then(port => { console.log('当前串口:', port); // 在这里初始化SerialPort实例 });
步骤3:添加远程修改接口
用Express做个极简的HTTP服务(也可以用原生http模块更轻量),允许远程发送POST请求修改配置:
const express = require('express'); const app = express(); app.use(express.json()); // 修改串口配置的接口 app.post('/update-serial-port', async (req, res) => { const newPort = req.body.portName; if (!newPort) { return res.status(400).send('请提供有效的串口名称'); } try { const configPath = path.join(__dirname, 'serial-config.json'); await fs.writeFile(configPath, JSON.stringify({ portName: newPort }, null, 2)); res.status(200).send(`串口已更新为: ${newPort}`); } catch (err) { res.status(500).send('更新配置失败'); console.error(err); } }); // 监听3000端口(可自行修改) app.listen(3000, () => { console.log('配置修改服务已启动,端口3000'); });
远程修改时,用curl命令即可完成:
curl -X POST -H "Content-Type: application/json" -d '{"portName":"COM8"}' http://你的树莓派IP:3000/update-serial-port
如果担心安全,可以给接口加个简单的API密钥验证,比如在请求里带?key=你的密钥,接口内判断是否匹配。
方案2:系统环境变量(适合和系统集成)
把串口名称存在Raspbian的环境变量里,Node.js可以直接通过process.env读取,远程修改可通过SSH或脚本更新环境配置文件。
步骤1:设置环境变量
编辑/etc/profile(全局生效,所有用户)或者~/.bashrc(仅当前用户生效),添加一行:
export SERIAL_PORT="COM7"
执行source /etc/profile或重启终端让配置生效。
步骤2:Node.js读取配置
const serialPort = process.env.SERIAL_PORT || 'COM7'; // 读不到时用默认值 console.log('当前串口:', serialPort); // 初始化SerialPort实例
步骤3:远程修改
远程通过SSH连接树莓派修改配置:
ssh pi@你的树莓派IP sudo nano /etc/profile # 修改SERIAL_PORT的值后保存退出 source /etc/profile # 重启你的Node.js应用(环境变量修改后需重启进程才会生效)
也可以写个简单的shell脚本,远程用curl触发脚本执行(需要配置sudo免密或使用合适权限)。
方案3:SQLite文件型数据库(可选,适合未来扩展)
虽然你提到不要数据库,但SQLite是文件型数据库,不需要启动任何数据库服务,本质就是一个本地文件,适合未来可能需要存储更多配置的场景。
步骤1:安装依赖
npm install sqlite3
步骤2:Node.js读写代码
const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('./serial-config.db'); // 初始化表(第一次运行时执行) db.run('CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT)', (err) => { if (err) console.error(err); // 插入默认值(如果无记录) db.get('SELECT value FROM config WHERE key = "serialPort"', (err, row) => { if (!row) { db.run('INSERT INTO config VALUES (?, ?)', ['serialPort', 'COM7']); } }); }); // 读取串口名称 function getSerialPort() { return new Promise((resolve, reject) => { db.get('SELECT value FROM config WHERE key = "serialPort"', (err, row) => { if (err) reject(err); resolve(row?.value || 'COM7'); }); }); } // 修改串口名称 function updateSerialPort(newPort) { return new Promise((resolve, reject) => { db.run('REPLACE INTO config VALUES (?, ?)', ['serialPort', newPort], (err) => { if (err) reject(err); resolve(); }); }); } // 调用示例 getSerialPort().then(port => console.log('当前串口:', port));
远程修改同样可以搭配方案1的HTTP接口,调用updateSerialPort方法即可。
这些方案都不需要额外的数据库服务,完全符合你的需求。个人最推荐方案1,因为实现简单、修改即时生效(无需重启Node.js应用),且代码复杂度极低。
内容的提问来源于stack exchange,提问作者Itzik.B

