mysql - 如何使用 Node.js 和 mysql2 连接到数据库来调试 Azure Function

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

在尝试找出 Azure 函数(基于 Node.js)可以连接到我们的 mysql 数据库(也托管在 Azure 上)时遇到一些问题。我们正在使用 mysql2 并几乎完全遵循教程( https://learn.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 的工作原理类似。

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

谢谢!! 本

最佳答案

我相信 Baskar 共享的链接涵盖了在本地调试您的函数

对于你的函数,你可以做一些改变来提高性能。

  1. 在函数代码之外创建与数据库的连接,否则每次都会创建一个新实例并连接。此外,您还可以启用池以重用连接,并且不超过运行 Azure Functions 的沙箱的 300 个限制。
  2. 将 Promise 与 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:我还没有测试过这段代码,但我相信这样的东西应该可以工作

关于mysql - 如何使用 Node.js 和 mysql2 连接到数据库来调试 Azure Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52976121/

相关文章:

mysql - 如何知道下一条记录是否存在

node.js - express/node.js 中请求之间的同步问题

javascript - 一键执行多个js文件

node.js - 如何使用 prisma 和 postgresql 处理条件准备语句?

MySql:使用 GROUP BY 和 MAX 选择最后插入的值

mysql - 如何创建MySQL触发器?

azure - 如何获取Azure Marketplace发布者ID和产品信息?

c# - CosmosDB 查询性能

c# - 部署到 Azure 时 Web.config 不正确

php - MySQL/PHP 错误 : Input a value with an apostrophe ( ' )