如何在启用ssl的情况下将Loopback应用连接到Google数据库?

时间:2019-06-26 02:03:55

标签: loopbackjs google-cloud-sql

我正在尝试将Loopback应用程序连接到Google SQL数据库,并且我更改了Datasource.json文件以匹配凭据。但是,当我在Loopback API资源管理器中发出GET请求时,出现错误。我没有找到有关如何在Datasource.json中指定ssl凭证的文档,我认为这是导致错误的原因。

我无济于事地尝试更改Datasource.json,以下是当前状态。我已更改了隐私的详细信息,但我可以100%确信凭据是正确的,因为我可以与javascript成功建立连接。

{
  "nameOfModel": {
    "name": "db",
    "connector": "mysql",
    "host": "xx.xxx.x.xxx",
    "port": xxxx,
    "user": "user",
    "password": "password",
    "database": "sql_db",
    "ssl": true,
    "ca" : "/server-ca.pem",
    "cert" : "/client-cert.pem",
    "key" : "/client-key.pem"
  }
}

这是我在回送API资源管理器上尝试GET请求时命令行返回的错误。 “错误:

  

5000毫秒后连接超时”使我相信它没有读取ssl凭据。

Unhandled error in GET /edd-sales?filter[offset]=0&filter[limit]=0&filter[skip]=0: 500 TypeError: Cannot read property 'name' of undefined
    at EddDbDataSource.DataSource.queueInvocation.DataSource.ready (D:\WebstormProjects\EDD-Database\edd-api\node_modules\loopback-datasource-juggler\lib\datasource.js:2577:81)

(node:10176) UnhandledPromiseRejectionWarning: Error: Timeout in connecting after 5000 ms
    at Timeout._onTimeout (D:\WebstormProjects\EDD-Database\edd-api\node_modules\loopback-datasource-juggler\lib\datasource.js:2572:10)
    at ontimeout (timers.js:498:11)

(node:10176) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:10176) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

2 个答案:

答案 0 :(得分:0)

您确定datasource.json允许您指定“ ssl”连接吗?您从哪里获得这些信息?我已经检查了他们的documentation,但他们没有显示您正在使用的“ ssl”属性。在MySQL连接器properties上都没有指定。

您有两个选择:

1.-不使用SSL创建连接。

2.-创建自己的connector或使用已实现ssl选项的现有http://example.com/api。请记住,这可能会导致LoopBack框架出现问题。

无论您决定使用这两个选项中的哪一个,请记住将您的IP(尝试访问数据库实例的IP)列入白名单,您可以在Cloud Console,在“连接”选项卡上的“公共IP”授权网络下。如果不这样做,可能会导致超时错误。

答案 1 :(得分:0)

尝试一下。我正在使用lookback3,对我来说效果很好。您需要创建datasources.local.js才能正确加载CA文件。

datasources.local.js

const fs = require('fs');

module.exports = {
  nameOfModel: {
    name: 'db',
    connector: 'mysql',
    host: 'xx.xxx.x.xxx',
    port: 'xxxx',
    user: 'user',
    password: 'password',
    database: 'sql_db',
    ssl: {
      ca: fs.readFileSync(`${__dirname}/server-ca.pem`),
      cert: fs.readFileSync(`${__dirname}/client-cert.pem`),
      key: fs.readFileSync(`${__dirname}/client-key.pem`),
    },
  }
}

请注意,您需要使用具有这些属性的对象来代替ssl: true