【问题标题】:How to debug an Azure Function using Node.js and mysql2 connecting to database如何使用 Node.js 和 mysql2 调试 Azure 函数连接到数据库
【发布时间】:2019-03-29 06:57:05
【问题描述】:

在尝试找出 Azure 函数(基于 node.js)可以连接到我们的 mysql 数据库(也托管在 Azure 上)时遇到了一些问题。我们正在使用 mysql2 并非常准确地遵循教程(https://docs.microsoft.com/en-us/azure/mysql/connect-nodejs 和类似的)这是调用的主要内容:

const mysql = require('mysql2');
const fs = require('fs');

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.fname || (req.body && req.body.fname)) {
        
        context.log('start');
        var config = {
            host:process.env['mysql_host'],
            user: process.env['mysql_user'],
            password: process.env['mysql_password'],
            port:3306,
            database:'database_name',
            ssl:{
            ca : fs.readFileSync(__dirname + '\\certs\\cacert.pem')
            },
            connectTimeout:5000
        };

        const conn = mysql.createConnection(config);
        /*context.log(conn);*/

        conn.connect(function (err) {
            context.log('here'); 
            if (err) { 
                context.error('error connecting: ' + err.stack);
                context.log("shit is broke");
                throw err;
            }
            console.log("Connection established.");  
            
        });

        context.log('mid');
        conn.query('SELECT 1+1',function(error,results,fields) {
            context.log('here');
            context.log(error);
            context.log(results);
            context.log(fields);
        });

基本上,遇到 conn.connect(function(err)... 不返回任何内容的问题 - 没有错误消息、没有日志等。 conn.query 的工作方式类似。

一切似乎都已正确设置,但我什至不知道下一步该去哪里解决问题。有没有人遇到过这种情况或对如何处理有建议?

谢谢!! 本

【问题讨论】:

标签: mysql node.js azure azure-functions azure-mysql-database


【解决方案1】:

由于显而易见的原因,在无服务器上进行调试具有挑战性。您可以尝试一种在本地调试的 hacky 解决方案(例如 Serverless Framework),但如果您的问题与与数据库的连接有关,那不一定对您有帮助。您可能会在本地看到不同的行为。

另一个选项是查看您是否可以使用Rookout 进行单步调试,这应该可以让您在代码执行的不同点捕获完整堆栈,并让您很好地了解失败的原因和原因。

【讨论】:

    【解决方案2】:

    我相信 Baskar 分享的链接涵盖了在本地调试您的功能

    至于您的功能,您可以进行一些更改以提高性能。

    1. 在函数代码之外创建与数据库的连接,否则它将创建一个新实例并每次都连接。此外,您可以启用池以重用连接,而不会超过运行 Azure Functions 的沙盒所具有的 300 个限制。
    2. 将 Promises 与 async/await 一起使用

    你基本上可以把你的代码更新成这样的

    const mysql = require('mysql2/promise');
    const fs = require('fs');
    
    var config = {
      host: process.env['mysql_host'],
      user: process.env['mysql_user'],
      password: process.env['mysql_password'],
      port: 3306,
      database: 'database_name',
      ssl: {
        ca: fs.readFileSync(__dirname + '\\certs\\cacert.pem')
      },
      connectTimeout: 5000,
      connectionLimit: 250,
      queueLimit: 0
    };
    const pool = mysql.createPool(config);
    
    module.exports = async function(context, req) {
      context.log('JavaScript HTTP trigger function processed a request.');
    
      if (req.query.fname || (req.body && req.body.fname)) {
        context.log('start');
    
        const conn = await pool.getConnection();
    
        context.log('mid');
    
        await conn.query('SELECT 1+1', function(error, results, fields) {
          context.log('here');
          context.log(error);
          context.log(results);
          context.log(fields);
        });
    
        conn.release();
      }
    };
    

    PS:我还没有测试这个代码,但我相信这样的东西应该可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      相关资源
      最近更新 更多