【问题标题】:how can I connect to my google cloud mysql database using a function deployed in firebase?如何使用部署在 firebase 中的函数连接到我的谷歌云 mysql 数据库?
【发布时间】:2020-03-29 20:38:42
【问题描述】:

我在firebase中部署了这个函数来连接我的谷歌云mysql数据库:

const functions = require('firebase-functions');

const mysql = require('mysql');

const connectionName = process.env.INSTANCE_CONNECTION_NAME || 'xxx';
const dbUser = process.env.SQL_USER || 'xxx';
const dbPassword = process.env.SQL_PASSWORD || 'xxx';
const dbName = process.env.SQL_NAME || 'xxx';

const mysqlConfig = {
  connectionLimit: 1,
  user: dbUser,
  password: dbPassword,
  database: dbName,
  socketPath: `/cloudsql/${connectionName}`,
};

if (process.env.NODE_ENV === 'production') {
  mysqlConfig.socketPath = `/cloudsql/${connectionName}`;
}

let mysqlPool;

exports.populateDatabase = functions.https.onRequest ((req, res) => {
  if (!mysqlPool) {
    mysqlPool = mysql.createPool(mysqlConfig);
  }

  mysqlPool.query('SELECT * from exercise', (err, results) => {
    if (err) {
      console.error(err);
      res.status(500).send(err);
    } else {
      res.send(JSON.stringify(results));
    }
  });

});

然后点击firebase中生成的链接,结果是这样的:

{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"/cloudsql/xxx","fatal":true}

我该如何解决这个问题?

【问题讨论】:

    标签: javascript mysql firebase google-cloud-functions google-cloud-sql


    【解决方案1】:

    从 Cloud Function 连接到 Cloud SQL 的完整说明在 documentation 中,由于太长,无法在此处简单列出。我建议您仔细阅读它们。

    需要注意的重要一点是该页面的以下声明:

    注意:这些说明要求您的 Cloud SQL 实例具有 公共 IP 地址。如果要使用私有 IP 地址,请参阅 Configuring Serverless VPC Access 并直接使用 私有IP。

    因此,如果您尝试使用私有 IP 地址进行访问,则必须设置一个 VPC 才能连接到它。

    【讨论】:

      【解决方案2】:

      假设您有一个带有外部 IP 地址的 SQL 数据库,那么您可以使用此代码进行连接。最重要的一步是使用以下环境变量部署您的云功能:CLOUD_SQL_CONNECTION_NAME = your-project:us-central1:your-instance。这将为您启动云 sql 代理。

      
      /**
       * Responds to any HTTP request.
       *
       * @param {!express:Request} req HTTP request context.
       * @param {!express:Response} res HTTP response context.
       */
      
      
      
      exports.connect= (req, res) => {
      
      
        var mysql = require('mysql');
      
      
      
        var pool = mysql.createPool({
          socketPath: `/cloudsql/your-project:us-central1:your-instance`,
          user            : 'test',
          password        : 'root',
          database        : 'data',
          connectionLimit : 10,               // this is the max number of connections before your pool starts waiting for a release
          multipleStatements : true           // I like this because it helps prevent nested sql statements, it can be buggy though, so be careful
      });
      
      
      
      
        pool.getConnection(function (err, conn) {
          if (err)
              return res.send(400);
      
          // if you got a connection...
          conn.query('SHOW DATABASES', function(err, rows) {
              if(err) {
                  conn.release();
                  return res.send(400, 'Couldnt get a connection');
              }
      
              // for simplicity, just send the rows
              res.status(200).send(rows);
      
              // CLOSE THE CONNECTION
              conn.release();
          })
      
          });
      
      
      
      
      };
      
      

      测试功能:

      [{"Database":"information_schema"},{"Database":"data"},{"Database":"mydatabase"},{"Database":"mysql"},{"Database":"performance_schema"},{"Database":"sys"}]
      

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 2019-03-05
        • 2015-06-09
        • 2020-07-22
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 2019-05-12
        相关资源
        最近更新 更多