Ubuntu 22.04下systemd运行Node服务时NPM config配置未被检测到
Node/Express应用通过systemd启动时无法读取config配置的问题
我在Ubuntu 22.04.1 LTS虚拟机上部署了基于Node/Express的简单Web应用,使用NPM的config包读取存储数据库连接参数的环境变量。从项目根目录通过终端启动时,应用运行完全正常,能成功连接MySQL、执行存储过程并在浏览器显示数据表。
该应用在Windows 10上开发,推送至Ubuntu虚拟机私有仓库后拉取到专用虚拟机运行。仅当以systemd服务运行时出现问题:服务守护进程能正常启动,但会弹出警告WARNING: No configurations found in configuration folder /home/my_profile/Documents/project_folder/config;客户端发送请求后,路由处理器触发错误Error: Configuration property "database.host" is not defined。
我推测这可能是权限或相对路径问题,但对systemd不熟悉,config文件夹内是JSON格式文件,求解决思路?
相关文件
project_webservice.service
[Unit] Description=Node Webserver Wants=Network.target After=syslog.target network-online.target [Service] Type=simple WorkingDirectory=/home/my_profile/Documents/project_folder ExecStart=/bin/bash ./startWebApp.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
index.js
const express = require('express'); const config = require('config'); const mysql = require('mysql'); const router = express.Router(); router.get('/', (req, res) => { const connection = mysql.createConnection({ host: config.get('database.host'), user: config.get('database.user'), port: 3306, password: config.get('database.password'), database: config.get('database.name') }); let viewData = {}; connection.connect(); connection.query("CALL get_summary_since_date('1990-01-01')", (error, results, fields) => { if (error) throw error; viewData = { columns: fields[0], rows: results[0] }; res.render('index.ejs', viewData); }); connection.end(); }); module.exports = router;
custom-environment-variables.json
{ "database": { "host": "DB_HOST", "user": "DB_USER", "password": "DB_PASSWORD", "name": "DB_DATABASE" } }
default.json
{}
已尝试的解决方法
- 切换
.service文件ExecStart属性的绝对/相对路径 - 将项目移至根目录,问题现象不变
- 在
index.js或service文件中设置NODE_CONFIG_DIR环境变量,无效 - 给config文件夹设置全权限
- 确认环境变量已配置
- 在service中指定用户/组,无效
- 用硬编码替代
config.get()可临时解决,但不符合需求 - 重新安装Ubuntu虚拟机测试,问题依旧
- 改用JS模块格式配置文件,无效
内容的提问来源于stack exchange,提问作者cawln
相关产品推荐
相关产品推荐

