You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需数据库在Raspbian系统存储串口名供Node.js调用并支持远程修改

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:55:22