簡體   English   中英

如何使用連接到數據庫的 Node.js 和 mysql2 調試 Azure 函數

[英]How to debug an Azure Function using Node.js and mysql2 connecting to database

嘗試找出 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 的工作方式類似。

一切似乎都設置正確,但我什至不知道下一步該去哪里解決問題。 有沒有人以前遇到過這種情況或對如何處理有建議?

謝謝!!

我相信 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:我還沒有測試過這段代碼,但我相信這樣的事情應該可以工作

由於顯而易見的原因,在無服務器上進行調試具有挑戰性。 您可以嘗試使用一種 hacky 解決方案在本地進行調試(如Serverless Framework ),但如果您的問題與數據庫連接有關,這不一定對您有幫助。 您可能會在本地看到不同的行為。

另一種選擇是查看您是否可以使用Rookout進行步調試,這應該可以讓您在代碼執行的不同點捕獲完整堆棧,並讓您很好地了解失敗的原因和原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM