Node.js连接Lando MySQL失败求助:非Node项目可正常连接
Node.js连接Lando MySQL失败排查请求
我在尝试将Node.js连接到Lando运行的MySQL数据库时遇到问题:数据库已正常启动,非Node.js项目均可正常连接,但Node.js连接失败。已尝试将host设为'database'、'localhost'和'internal'均无效,当前使用Node.js v18.19.0、npm v10.2.3。以下是相关代码、配置及报错信息,求排查原因:
Node.js连接代码
const express = require('express'); const app = express(); const cors = require('cors'); const mysql = require('mysql'); app.use(cors()); const db = mysql.createConnection({ host: 'database', user: 'lemp', password: 'lemp', database: 'lemp', port: 3306 });
Lando配置
services: database: type: mysql creds: username: lemp password: lemp
数据库终端信息
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lemp | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use lemp Database changed
报错信息
$ node index.js Server listening on port 8080 /home/maarten/www/react/test/server/index.js:19 if (err) throw err; ^ Error: getaddrinfo EAI_AGAIN database at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) -------------------- at Protocol._enqueue (/home/maarten/www/react/test/server/node_modules/mysql/lib/protocol/Protocol.js:144:48) at Protocol.handshake (/home/maarten/www/react/test/server/node_modules/mysql/lib/protocol/Protocol.js:51:23) at Connection.connect (/home/maarten/www/react/test/server/node_modules/mysql/lib/Connection.js:116:18) at Object.<anonymous> (/home/maarten/www/react/test/server/index.js:18:4) at Module._compile (node:internal/modules/cjs/loader:1356:14) at Module._extensions..js (node:internal/modules/cjs/loader:1414:10) at Module.load (node:internal/modules/cjs/loader:1197:32) at Module._load (node:internal/modules/cjs/loader:1013:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12) at node:internal/main/run_main_module:28:49 { errno: -3001, code: 'EAI_AGAIN', syscall: 'getaddrinfo', hostname: 'database', fatal: true } Node.js v18.19.0
排查方案
- 确认Node服务运行环境:如果Node.js是本地直接启动(非Lando服务),则无法通过'database'内部主机名访问,需用
localhost+Lando暴露的外部端口(执行lando info查看database服务的external_connection.port)。 - 检查容器网络连通性:若Node是Lando服务,通过
lando ssh进入Node容器,执行ping database验证主机解析,无效则重启Lando(lando restart)。 - 替换数据库包:旧
mysql包与Node.js v18+可能存在兼容性问题,安装mysql2并替换代码中的require('mysql')为require('mysql2')。 - 校验用户访问权限:进入数据库终端执行
SELECT host, user FROM mysql.user WHERE user='lemp';,若host非%,执行以下命令开放权限:ALTER USER 'lemp'@'%' IDENTIFIED BY 'lemp'; FLUSH PRIVILEGES; - 核对Lando服务配置:执行
lando info,确认database服务的internal_connection参数(host、port、账号密码)与Node代码完全一致。
内容的提问来源于stack exchange,提问作者Maarten
相关产品推荐
相关产品推荐

