Как отладить функцию Azure, используя Node.js и mysql2, подключающиеся к базе данных
При возникновении некоторых проблем, пытающихся выяснить, функция 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 ответа
Отладка на безсерверном носит сложный характер по очевидным причинам. Вы можете попробовать одно из хакерских решений для локальной отладки (например, Serverless Framework), но это не обязательно поможет вам, если ваша проблема связана с подключением к БД. Вы можете увидеть другое поведение на местном уровне.
Другой вариант - посмотреть, можете ли вы выполнить пошаговую отладку с помощью Rookout, что позволит вам поймать полный стек в разных точках выполнения кода и дать вам хорошее представление о том, что дает сбой и почему.
Я полагаю, что ссылка, которой поделился Баскар, охватывает отладку вашей функции локально
Что касается вашей функции, вы можете внести некоторые изменения, чтобы улучшить производительность.
- Создайте соединение с БД вне кода функции, в противном случае он будет создавать новый экземпляр и подключаться каждый раз. Кроме того, вы можете включить объединение в пул для повторного использования соединений и не превышать ограничение 300, установленное в песочнице, в которой выполняются функции Azure.
- Используйте Обещания вместе с 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: я не тестировал этот код как таковой, но я считаю, что что-то вроде этого должно работать