Как я могу подключиться к моей базе данных Google Cloud mysql с помощью функции, развернутой в Firebase? - PullRequest
0 голосов
/ 29 марта 2020

Я развернул эту функцию в firebase для подключения к своему облаку Google. 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}

как мне решить проблему?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Если у вас есть база данных SQL с внешним IP-адресом, то вы можете подключиться с помощью этого кода. Наиболее важным шагом является развертывание облачной функции со следующей переменной среды: 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"}]
0 голосов
/ 30 марта 2020

Полные инструкции по подключению к Cloud SQL из Cloud Function содержатся в документации , и их слишком много, чтобы их просто перечислить здесь. Я предлагаю внимательно прочитать их.

Одна важная вещь, на которую следует обратить внимание, это утверждение на этой странице:

Примечание. Эти инструкции требуют, чтобы ваш экземпляр Cloud SQL имел publi c IP-адрес. Если вы хотите использовать частный IP-адрес, см. Настройка Serverless VP C Доступ и подключение напрямую с использованием частного IP.

Итак, если вы пытаетесь получить доступ с частным IP-адресом вам потребуется настроить VP C для подключения к нему.

...