我有一个 Nuxt 3 应用程序部署到 Firebase 托管,我需要从该应用程序访问 CPanel 共享托管上的远程 MySQL 数据库。 Nuxt 3 应用程序是客户端-服务器,并使用 Nuxt 提供的默认 Nitro 服务器。
您可能知道,在使用 Nitro 服务器或 Firebase Functions 时,会在 Cloud Run 中创建一个“函数”,它是实际的服务器。
为了测试应用程序到数据库的连接,我已在 CPanel > 管理访问主机中允许所有主机 (%.%.%.%)。 直接从本地主机或通过 Firebase 模拟器一切正常,但部署在 Firebase 托管上时则不然。
此外,来自我的 Nuxt 服务器端点的 HTTP 请求用于测试资源,例如: https://jsonplaceholder.typicode.com/users正在工作。
GCP 中似乎有一条防火墙规则阻止 mysql 协议的传出访问。任何人都可以确认这一点吗?
我还尝试在 VPC 防火墙规则中设置“允许全部”规则 (https://console.cloud.google.com/net-security/firewall-manager/firewall-policies/list),但没有成功。
这是我在 GCP Logs Explorer 中遇到的错误:
Error: connect ETIMEDOUT at Object.createConnection
(/workspace/node_modules/mysql2/promise.js:253:31) at Object.handler
(file:///workspace/chunks/routes/api/hello.mjs:18:30) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:2805:24) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:3115:34) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:2876:31) at process.processTicksAndRejections
(node:internal/process/task_queues:95:5) at async toNodeHandle
(file:///workspace/chunks/_/nitro.mjs:3147:7) { code: 'ETIMEDOUT', errno: undefined, sqlState: undefined }
在浏览器中,我回来了: FetchError:[GET]“/api/hello”:500
这是我正在使用的代码:
// file hello.ts in my Nuxt 3 /server/api folder
import mysql from "mysql2/promise";
import { User } from "~/server/models/User";
export default defineEventHandler(async (event) => {
try {
// code throwing the error:
const conn = await mysql.createConnection({
host: <remote host>,
user: <username>,
database: <db name>,
password: <db password>,
});
//
const [rows] = await conn.query("SELECT id FROM users");
console.log(">>> users: ", rows);
return rows as User[];
} catch (error) {
console.error(">>> Error:", error);
return error;
}
});
任何有关如何解决此问题的想法将不胜感激。
您是否测试过创建特定的防火墙规则?专门为与您的 Cloud Run 实例关联的标签或网络定义规则,并设置规则以允许出站流量到达 MySQL 数据库 IP 和端口 3306(适用于 MySQL)。我们走吧。