Как отладить функцию Azure, используя Node.js и mysql2, подключающиеся к базе данных - PullRequest
0 голосов
/ 24 октября 2018

, столкнувшись с некоторыми проблемами, пытаясь выяснить, какую функцию 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 (функция (err) ... ничего не возвращает - нет сообщений об ошибках, нет журналов и т. Д. Conn.query работает аналогичным образом.

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

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

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

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

0 голосов
/ 25 октября 2018

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

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

  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: я не тестировал этот код как таковой, но я считаю, что что-то подобное должно работать

...