Node.js脚本命令行可连MongoDB,Cron执行时连接超时
Ubuntu服务器Cron执行Node.js脚本连接本地MongoDB超时问题
问题现象
- 命令行执行
node <脚本名>时,Node.js脚本可正常连接本地MongoDB;通过Cron执行相同命令时,出现连接超时,耗时近30秒,且dbInstance为undefined。 - 日志显示
DB_URL输出正常,原使用mongodb://usr:pwd@localhost:27017连接串,改用公网域名连接串mongodb://usr:pwd@my-domain:27017后,Cron执行恢复正常。
相关代码
const mongodb = require("mongodb").MongoClient; const env = require("dotenv").config({ path: "../.env", }).parsed; async function dbConnection() { let url = env.DB_URL; console.log("DB_URL", url); let opts = { useNewUrlParser: true, useUnifiedTopology: true }; try { return mongodb.connect(url, opts); } catch (err) { throw err; } } async function DataLoading() { try { let dbInstance; try { dbInstance = await dbConnection() if(!dbInstance) throw "DB connection failed" } catch (err) { errors.push({ date: new Date().toISOString(), error: err, location: "Db connection" }); } console.log("Time elapsed: " + (new Date() - time) ) let dbStocks = dbInstance.db(env.DB_NAME).collection("stocks") // 剩余业务代码省略 } catch (err) { // 全局错误处理省略 } }
Cron配置
00 22 * * 1-5 cd /path/to/scripts/folder && node script.js >> cronErrors.txt
mongod.conf配置
# network interfaces net: bindIp: 127.0.0.1, 127.0.0.2, <my-domain.com>, localhost port: 27017 tls: mode: requireTLS certificateKeyFile: /etc/ssl/mongo.pem # how the process runs processManagement: timeZoneInfo: /usr/share/zoneinfo security: authorization: 'enabled'
问题原因分析
Cron的执行环境与用户命令行环境存在差异:
- Cron环境的
hosts解析可能存在异常,导致localhost无法正确映射到MongoDB绑定的127.0.0.1地址; - 或者MongoDB的TLS配置在Cron环境下,对
localhost的证书验证逻辑存在问题,而使用公网域名时证书验证正常通过。
改用公网域名连接串后,域名解析能正确指向MongoDB绑定的地址,同时TLS证书验证匹配,因此连接恢复正常。
内容的提问来源于stack exchange,提问作者hello-there
相关产品推荐
相关产品推荐

