Как отлаживать функцию Azure с помощью Node.js и mysql2, подключающихся к базе данных

running into some issues trying to figure out an Azure Function (node.js-based) can connect to our mysql database (also hosted on Azure). We're using mysql2 and following tutorials pretty much exactly (https://docs.microsoft.com/en-us/azure/mysql/connect-nodejs, and similar) Here's the meat of the call:

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 работает аналогично.

Кажется, все настроено правильно, но я даже не знаю, куда смотреть дальше, чтобы решить проблему. Кто-нибудь сталкивался с этим раньше или может посоветовать, как справиться?

Спасибо!! Бен


person Ben    schedule 24.10.2018    source источник
comment
Проверьте эту тему github.com/Azure/azure-functions-core-tools /вопросы/557   -  person Baskar Rao    schedule 25.10.2018
comment
Я столкнулся с той же проблемой. Вы нашли какое-нибудь разрешение?   -  person Pushkin    schedule 28.08.2019


Ответы (2)


Я считаю, что ссылка, которой поделился Баскар, охватывает локальную отладку вашей функции.

Что касается вашей функции, вы можете внести некоторые изменения для повышения производительности.

  1. Создайте соединение с БД вне кода функции, иначе он будет создавать новый экземпляр и подключаться каждый раз. Кроме того, вы можете включить объединение в пул, чтобы повторно использовать подключения и не превышать ограничение в 300, установленное для песочницы, в которой выполняются функции Azure.
  2. Используйте промисы вместе с 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: я не тестировал этот код как таковой, но я считаю, что что-то вроде этого должно работать

person PramodValavala-MSFT    schedule 25.10.2018

Отладка на бессерверной платформе сложна по очевидным причинам. Вы можете попробовать одно из хакерских решений для локальной отладки (например, Serverless Framework), но это не обязательно поможет. вам, если ваша проблема связана с подключением к БД. Вы можете увидеть другое поведение локально.

Другой вариант — посмотреть, сможете ли вы выполнить пошаговую отладку с помощью Rookout, что позволит вам поймать полный стек на разных этапах выполнения кода и дает вам хорошее представление о том, что не удается и почему.

person Arieh Kovler    schedule 31.10.2018