当前位置: 首页 > 知识库问答 >
问题:

如何从Cloud Functions连接Google CloudSQL?

何涵畅
2023-03-14

我正在尝试使用Firebase的云函数来构建一个API,该API与Google Cloud SQL(PostgreSQL)实例进行对话。

我正在使用HTTP(S)触发器。

当我用白名单列出桌面的IP地址时,我可以通过函数的节点连接到云SQL。来自本地计算机的js代码。但当我部署时,我无法连接到白名单,也无法计算Firebase功能服务器的主机IP地址。

您如何从Firebase的云函数与Google Cloud SQL对话?

谢谢

// Code Sample, of what's working on Localhost.
var functions = require('firebase-functions');

var pg = require('pg');
var pgConfig = {
  user: functions.config().pg.user,
  database: functions.config().pg.database,
  password: functions.config().pg.password,
  host: functions.config().pg.host
}

exports.helloSql = functions.https.onRequest((request, response) => {
  console.log('connecting...');
  try {
    client.connect(function(err) {
      if (err) throw err;

      console.log('connection success');
      console.log('querying...');

      client.query('SELECT * FROM guestbook;', function(err, result){
        if (err) throw err;

        console.log('querying success.');
        console.log('Results: ', result);
        console.log('Ending...');

        client.end(function(err){
          if (err) throw err;
          console.log('End success.');
          response.send(result);
        });
      });

    });
  } catch(er) {
    console.error(er.stack)
    response.status(500).send(er);
  }
});

共有3个答案

范朗
2023-03-14

在GCP上查找您的数据库区域和实例名称

通过运行以下命令将您的数据库密码保存到Firebase环境中:

$ firebase functions:config:set \
    db.user="<username>" \
    db.password="<password>" \
    db.database="<database>"

然后

const { Pool } = require('pg');
const { config } = require('firebase-functions');

const project = process.env.GCP_PROJECT;
const region = 'europe-west1';
const instance = 'db';

module.exports = new Pool({
  max: 1,
  host: `/cloudsql/${project}:${region}:${instance}`,
  ...config().db
});
const { https } = require('firebase-functions');
const db = require('./db');

module.exports = https.onRequest((req, res) =>
  db
    .query('SELECT version()')
    .then(({ rows: [{ version }]) => {
      res.send(version);
    }));

另请参阅https://stackoverflow.com/a/48825037/82686(通过Babel使用现代JavaScript语法)

云宜人
2023-03-14

新答案:

看看其他答案吧,它现在得到了官方的支持。https://cloud.google.com/functions/docs/sql

旧答案:

目前还不可能。不过,这是问题追踪器#36388165上的功能请求:

目前不支持从云函数连接到云SQL,因为UNIX套接字不存在(导致eNote),并且没有定义到白名单的IP范围(导致ETIMEDOUT)。一种可能性是从Cloud SQL实例中将0.0.0.0/0列入白名单,但出于安全原因,不建议这样做。

如果这对你来说是一个重要的功能,我建议你访问issuetracker并启动该功能请求,以帮助它获得人气。

邢飞鸿
2023-03-14

我在对#36388165的进一步讨论中找到了答案。

免责声明:这似乎没有正式待公布,所以可能会改变后。我只在mysql中测试。但是这个解决方案的性质,我认为应该和pg模块一样工作(它似乎接受域套接字路径作为主机参数)

编辑(2017/12/7):谷歌似乎提供了官方的早期访问,同样的方法仍然有效
EDIT(2018/07/04):似乎有人只是复制并粘贴了我的示例代码,然后惹了麻烦。正如谷歌所说,你应该使用连接池来避免sql连接泄漏。(它会导致ECONNREFUSE)所以我稍微更改了示例代码。编辑(2019/04/04):在下面的示例中,使用$DBNAME作为扳手实例名称令人困惑,我修改了示例。

在里面https://issuetracker.google.com/issues/36388165#comment44google guy表示,云函数实例可以通过特殊路径“/cloudsql/$PROJECT_ID:$REGION:$DBNAME”中的域套接字与云sql进行对话。

我实际上可以从云函数代码下面连接和操作云SQL。

const mysql = require('mysql');
const pool = mysql.createPool({
    connectionLimit : 1,
    socketPath: '/cloudsql/' + '$PROJECT_ID:$REGION:$SPANNER_INSTANCE_NAME',
    user: '$USER',
    password: '$PASS',
    database: '$DATABASE'
});
exports.handler = function handler(req, res) {
    //using pool instead of creating connection with function call
    pool.query(`SELECT * FROM table where id = ?`, 
                                req.body.id, function (e, results) {
        //made reply here
    });
};

我希望这将有助于那些迫不及待地等待谷歌正式宣布的人。

 类似资料:
  • 您好,我正在尝试从php连接到firebase数据库,我有以下代码 我得到了这个错误 致命错误:未捕获类型错误:传递给Kreait\Firebase\Factory::的参数1必须是Kreait\Firebase\Service帐户的实例,给出字符串,在第10行的C:\xampp\htdocs\MedEntrance\dbconfig.php中调用,并在C:\xampp\htdocs\中定义Med

  • 我今天脑子很慢... 我有一张像这样的表格 WP_PostMeta 我想这样显示此列: 我已使用此查询进行了测试 但我错了; 任何曲目都很受欢迎。

  • 我有一张siswa和kelas的联合表格。在kelas表中有一列idSiswa,它来自siswa表的id。问题是当kelas加入时,我如何从他那里获得id。当我尝试获取id时,它显示了来自siswa表的id,而不是来自kelas表的id,我也已经使用了右连接和左连接,但仍然没有得到答案 我使用来自laravel的查询生成器来运行查询,这是我的查询

  • 我有一台安装了PostgreSQL的服务器。我的所有服务都在容器中工作(docker-compose)。我想从容器中使用我的主机PostgreSQL。但是我有错误: 我的docker compose使用主机网络模式,如下所示: 我的数据库连接URL是:jdbc:postgresql://localhost:5432/shop-bd

  • 我试图通过Windows服务从套接字接收数据,但当我建立连接时,它会立即生效。我希望不断地接收它(当端口关闭时,它将断开连接)。我怎样才能做到这一点? 这是我现在的输出; “GET/HTTP/1.1 主持人:127.0.0.1:1994 连接:保持活力 缓存控制:最大年龄=0 升级-不安全-请求: 1 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)Apple

  • rank ▲ ✰ vote url 80 336 196 470 url 如何连接MySQL? 在python程序里如何链接MySQL数据库? 连接MYSQL需要3步 1 安装 你必须先安装MySQL驱动.和PHP不一样,Python只默认安装了SQLite的驱动.最常用的包是MySQLdb但是用easy_install安装很困难. 对于Window用户,你可以获取MySQLdb的exe. 对于L