NodeJS 到云SQL的连接在本地运行,但在App Engine上不运行

gzszwxb4  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(148)

我在App Engine上托管了NodeJS API,在Cloud SQL上托管了MySQL示例
我使用mysql2和dotenv包进行连接和环境变量访问,下面是我创建连接的方法:

import mysql from "mysql2";
import * as dotenv from "dotenv";
dotenv.config();

export const db =
    process.env.NODE_ENV === "development"
        ? mysql.createConnection({
                host: process.env.DB_HOST,
                user: process.env.DB_USER,
                password: process.env.DB_PASS,
                database: process.env.DB_NAME,
          })
        : mysql.createConnection({
                user: process.env.DB_USER,
                password: process.env.DB_PASS,
                database: process.env.DB_NAME,
                socketPath: `/cloudsql/${process.env.DB_INSTANCE_NAME}`,
          });

我通过阅读GCP的官方文档来创建此连接,当我在本地运行它时,它工作正常,但当我将应用程序部署到App Engine时,我收到此错误:

Error: getaddrinfo ENOTFOUND 172.17.0.1:3306

我认为ip和port是代理连接或类似连接的默认值,因为我没有在任何变量上设置该ip
下面是我在app.yaml上设置环境变量的方法

runtime: nodejs14
env: standard
instance_class: F1
automatic_scaling:
   min_idle_instances: 1
   max_idle_instances: automatic
   min_pending_latency: automatic
   max_pending_latency: automatic
env_variables:
   DB_USER: <db-user>
   DB_PASS: <db-pass>
   DB_NAME: <db-name>
   NODE_ENV: production
   DB_INSTANCE_NAME: <db-instance-name>
beta_settings:
   cloud_sql_instances: <db-instance-name>

我已检查服务用户是否具有正确的权限和角色
我不知道我是否错过了一些配置或如果我的app.yaml需要另一件事
我曾尝试在连接创建过程中直接添加IP主机,但遇到了相同的问题

export const db =
    process.env.NODE_ENV === "development"
        ? mysql.createConnection({
                host: process.env.DB_HOST,
                user: process.env.DB_USER,
                password: process.env.DB_PASS,
                database: process.env.DB_NAME,
          })
        : mysql.createConnection({
                                host: process.env.DB_HOST,
                user: process.env.DB_USER,
                password: process.env.DB_PASS,
                database: process.env.DB_NAME,
                socketPath: `/cloudsql/${process.env.DB_INSTANCE_NAME}`,
          });

我已经为这个问题奋斗了三天,所以任何帮助对我来说都将是非常感激的
先谢了。

7rtdyuoh

7rtdyuoh1#

Error: getaddrinfo ENOTFOUND表示客户端无法连接到给定的地址。这可能是由于不同的原因。
请确保上面创建的示例具有公共IP地址。您可以在Google Cloud控制台中的示例概述页面上验证此设置。如果需要添加一个,请参阅Configuring public IP page以获取说明。
确保应用用于验证对Cloud SQL的调用的服务帐户具有适当的Cloud SQL角色和权限。
确保云SQL示例配置为允许从App Engine连接。INSTANCE_CONNECTION_NAME使用project:region:instance-id。您可以在Google Cloud控制台中的示例概述页上找到该格式。
我看到您使用的是createConnection方法,而您可以使用createPool方法,该方法可以更准确地解决问题。
有关详细信息,请参阅这些文档和Link,它们可能会对您有所帮助。

相关问题