我正在尝试将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.
答案 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
文件。
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
。