Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从App Engine中的节点JS连接到云MySQL_Mysql_Node.js_Google App Engine_Google Cloud Platform - Fatal编程技术网

无法从App Engine中的节点JS连接到云MySQL

无法从App Engine中的节点JS连接到云MySQL,mysql,node.js,google-app-engine,google-cloud-platform,Mysql,Node.js,Google App Engine,Google Cloud Platform,我有一个使用MySQL的NodeJS应用程序,可以在本地运行,但是现在我已经在app Engine中部署了它,我需要将它连接到MySQL Google Cloud,我已经创建了MySQL实例和数据库,但是我无法将我的应用程序(应用程序引擎中的NodeJS)连接到MySQL Cloud中的数据库,我使用以下代码: const mysql = require('mysql'); var con = mysql.createConnection({ host: "host-IP&qu

我有一个使用MySQL的NodeJS应用程序,可以在本地运行,但是现在我已经在app Engine中部署了它,我需要将它连接到MySQL Google Cloud,我已经创建了MySQL实例和数据库,但是我无法将我的应用程序(应用程序引擎中的NodeJS)连接到MySQL Cloud中的数据库,我使用以下代码:

const mysql = require('mysql');


var con = mysql.createConnection({
  host: "host-IP",
  socketPath: "/cloudsql/project:region:instance",
  user: "USERNAME",
  password: "USERPASSWORD"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});

module.exports = con;
亚马尔档案馆---------------------------

runtime: nodejs
env: flex
env_variables:
  SQL_USER: "USERNAME"
  SQL_PASSWORD: "USERPASSWORD"
  SQL_DATABASE: "DBNAME"
  INSTANCE_CONNECTION_NAME: "project:region:instance"
beta_settings:
  cloud_sql_instances: "project:region:instance"

请帮助我。

从App Engine Flexible连接到云SQL实例有两个选项。您可以通过实例的公共或私有IP进行连接

我的建议是通过私有IP连接,因为私有IP上的连接提供了较低的延迟和有限的攻击向量,因为它们不需要穿越互联网

假设您已经有一个实例并通过公共IP连接,以下是步骤:

  • 在您的云SQL实例中创建和

  • 获取实例的
    实例连接\u名称
    。可以通过实例概述,即
    gcloud sql instances description[instance\u NAME]
    命令找到它。它具有
    projectID:region:instanceName
    格式

  • 将应用程序用于验证对云SQL调用的服务帐户授予以下云SQL角色之一,包括
    cloudsql.instances.connect
    cloudsql.instances.get
    权限:

    • 云SQL客户端
    • 云SQL编辑器
    • 云SQL管理
    这里需要记住的两件事是,默认情况下,App Engine使用授予编辑器角色的App Engine flexible environment服务帐户,并且如果使用的服务帐户属于与云SQL实例不同的项目,则需要为这两个项目添加云SQL管理API和IAM权限

  • 根据您希望通过以下方式连接的选项配置您的
    app.yaml

    Unix套接字

    beta_settings:
    cloud_sql_instances: INSTANCE_CONNECTION_NAME
    
    TCP端口

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME:port
    
  • 包括以下环境变量:

     env_variables:
       DB_USER: MY_DB_USER
       DB_PASS: MY_DB_PASSWORD
       DB_NAME: MY_DATABASE
       # e.g. my-awesome-project:us-central1:my-cloud-sql-instance
       CLOUD_SQL_CONNECTION_NAME: <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
    

  • 您可以在和中找到所有详细信息,让mysql受到来自互联网的攻击是一个非常糟糕的主意。阅读REST,其中有一个服务器端脚本,可以处理所有traffuc@nbk对不起,我是新来的,请你再给我解释一下你说的话,以及我如何解决mysql面临攻击的问题,好吗!NodeJS已经是一个服务器端脚本,您希望访问云中的mysql数据。由于您应该使mysql服务器可用,您有一些可能性,您可以为云编写一个nodes js脚本,该脚本将在clud服务器上运行,或者您可以编写一个具有相同意图的php脚本,或者您可以编写一个angularjs脚本,该脚本可以使用ajax从云服务器获取数据。当我想到这一点时,为什么不直接在云中运行nodejs nt呢?看来你已经发布了敏感/私有信息。如果是这种情况,请重置您的密码和/或撤销API密钥和令牌,因为在互联网上发布这些密钥和令牌时会被视为已被泄露。
     const createUnixSocketPool = async (config) => {
       const dbSocketPath = process.env.DB_SOCKET_PATH || "/cloudsql"
    
       // Establish a connection to the database
       return await mysql.createPool({
         user: process.env.DB_USER, // e.g. 'my-db-user'
         password: process.env.DB_PASS, // e.g. 'my-db-password'
         database: process.env.DB_NAME, // e.g. 'my-database'
         // If connecting via unix domain socket, specify the path
         socketPath: `${dbSocketPath}/${process.env.CLOUD_SQL_CONNECTION_NAME}`,
         // Specify additional properties here.
         ...config
       });
     }