【问题标题】:Unable to connect NodeJS app in Azure App Services to Azure MySQL Database无法将 Azure 应用服务中的 NodeJS 应用连接到 Azure MySQL 数据库
【发布时间】:2020-04-07 18:13:46
【问题描述】:

我已将 NodeJS(使用 ExpressJS、Sequelize)部署到 Azure 应用服务。没有数据库连接的简单 API 可以工作,但是当我使用从 Azure MySQL 数据库加载数据的应用程序部分时,证书出现问题。我从应用服务日志流中得到这条日志消息:

Unhandled rejection SequelizeConnectionError: unable to get local issuer certificate

我已按照here 中关于如何启用防火墙和使用证书 (BaltimoreCyber​​TrustRoot.crt.pem) 的步骤进行操作。

使用相同的指令,从我的笔记本电脑,我可以使用这个 CLI 连接到远程 Azure MySQL 数据库:

$ mysql -h <my-db>.mysql.database.azure.com -u <my-user> --ssl-mode=REQUIRED --ssl-ca=.\BaltimoreCyberTrustRoot.crt.pem -p

我已经关注了与此相关的其他 StackOverflow / Github 问题,并且我遵循了他们的配置,如下所示:

const mysql = require('mysql2');
...
var sequelize = new Sequelize(config.db, config.username, config.password, {
    host:    "<my-db>.mysql.database.azure.com",
    port:    3306,
    dialect: 'mysql',
    dialectOptions: {
        ssl: {
            ca: fs.readFileSync(__dirname + "/ssl/BaltimoreCyberTrustRoot.crt.pem")
        }
    }
});

我需要在ssl 下设置额外的密钥/证书吗?

ssl: {
    key: fs.readFileSync(__dirname + "./certs/client-key.pem"),
    cert: fs.readFileSync(__dirname + "./certs/client-cert.pem"),
    ca: fs.readFileSync(__dirname + "/ssl/BaltimoreCyberTrustRoot.crt.pem")
}

我正在使用节点 12(Azure 应用服务中的节点 12.13),这是我的 package.json 依赖项:

"dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "faker": "^4.1.0",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.5"
}

【问题讨论】:

  • @Jason 感谢您的回答。我没有回去,因为我只在周末工作。但是,一旦我测试了它,我会接受你的答案,加油!。

标签: mysql node.js azure sequelize.js azure-web-app-service


【解决方案1】:

根据我的测试,我可以连接到mysql。您可以添加额外的密钥/证书是或否。

如果你添加,你可以看到我的代码如下,

/*configuration*/
const sequelizeInstance  = new Sequelize("***db", "azure_root@***mysql", "Ja***.****20", {
host: "***mysql.mysql.database.azure.com",
dialect: 'mysql',
dialectOptions: {
    ssl: {
        ca: fs.readFileSync(path.resolve(__dirname, 'BaltimoreCyberTrustRoot.crt.pem'));
    }
}
});

/*test connection*/
try
{
    sequelizeInstance.authenticate();
    console.log('Connection has been established successfully.');
} 
catch (error) {
    console.error('Unable to connect to the database:', error);
}

如果没有,您只需将 ssl=true 设置为 document 即可。

希望对你有用。

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多