javascript - 如何从 Cloud Functions 连接 Google Cloud SQL?

标签 javascript firebase google-cloud-platform google-cloud-sql google-cloud-functions

我正在尝试使用Cloud Functions for Firebase构建与 Google Cloud SQL (PostgreSQL) 实例对话的 API。

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

当我将桌面的 IP 地址列入白名单时,我可以使用本地计算机上的函数的 node.js 代码连接到 Cloud SQL。但是当我部署时,我无法连接,并且无法找出Firebase Function服务器的HOST IP地址,将其列入白名单。

如何从 Cloud Functions for 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);
  }
});

最佳答案

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

免责声明:这似乎没有正式宣布,因此之后可能会发生变化。我也只在mysql中测试。但这个解决方案的性质,我认为应该与 pg 模块中相同的方式工作(似乎 accept domain socket path 作为主机参数)

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

https://issuetracker.google.com/issues/36388165#comment44谷歌人说云函数实例可以通过特殊路径“/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
    });
};

我希望这对那些迫不及待谷歌官方宣布的人有所帮助。

关于javascript - 如何从 Cloud Functions 连接 Google Cloud SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43023107/

相关文章:

javascript - refresh_ce 的含义和来源

javascript - 如何在 Google Cloud Compute node.js getVMs 中使用正则表达式进行过滤

node.js - 无法从 nodemailer 发送电子邮件

android - 使用 Firebase 的最低 Google Play 服务版本是多少?

docker - gcr.io 的拉取访问被拒绝

javascript - NodeJS 的 BPMN 引擎,类似于 Activiti 或 jBPM

javascript - dojo.itemFileReadStore 在嵌套数组上失败

javascript - 单击菜单项后,如何将此响应式下拉菜单设为 "close"?

firebase - 有没有可以查询 Firebase 数据库的 UI 控制台?

android - 将firebase数据库url(字符串)分配给数据库引用变量?