連線 Azure SQL 的 Node.js 範例代碼

既然你的開發環境已經串接成功,接下來就是把 server.js 升級,讓它具備連線到 Azure SQL Database 的能力。

在 Azure App Service 上,我們強烈建議使用 受控識別 (Managed Identity)。這能讓你的程式碼在沒有帳號密碼的情況下,安全地存取資料庫。

1. 安裝必要套件

在你的專案目錄下執行以下指令,安裝 SQL 驅動程式與 Azure 身分驗證工具:

PowerShell

npm install mssql @azure/identity

2. 更新 server.js 加入 SQL 連線邏輯

請將 server.js 修改為以下內容。這個版本整合了原本的靜態檔案託管與新的資料庫查詢功能:

JavaScript

import express from 'express';
import path from 'path';
import { fileURLToPath } from 'url';
import sql from 'mssql';
import { DefaultAzureCredential } from '@azure/identity';

const app = express();
const port = process.env.PORT || 8080;

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

app.use(express.static(path.join(__dirname, 'dist')));

// Azure SQL 連線設定
const config = {
    server: process.env.DB_SERVER, // 例如: your-server.database.windows.net
    database: process.env.DB_NAME,
    options: {
        encrypt: true,
        trustServerCertificate: false
    },
    authentication: {
        type: 'azure-active-directory-default', // 使用受控識別
        options: {
            credential: new DefaultAzureCredential()
        }
    }
};

// 建立一個 API 路由來抓取資料庫資料
app.get('/api/sql-data', async (req, res) => {
    try {
        console.log('正在嘗試連線到 SQL Server...');
        let pool = await sql.connect(config);
        let result = await pool.request().query('SELECT TOP 5 * FROM YourTableName');
        res.json(result.recordset);
    } catch (err) {
        console.error('SQL 錯誤:', err);
        res.status(500).json({ error: '無法讀取資料庫', details: err.message });
    }
});

app.get('/api/config-test', (req, res) => {
    res.json({
        dbServer: process.env.DB_SERVER || "未設定",
        dbName: process.env.DB_NAME || "未設定"
    });
});

app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`);
});

3. 如何在 Local 測試連線?

由於 DefaultAzureCredential 非常聰明,它會依照環境切換驗證方式:

  1. 在 Local:它會嘗試抓取你電腦上 az login 的身分。請確保你在 PowerShell 執行過 az login 並有權限存取該資料庫。
  2. 在 Azure:它會自動改用 App Service 的「受控識別」。

測試時,請先在 PowerShell 設定環境變數:

PowerShell

$env:DB_SERVER="你的伺服器.database.windows.net"
$env:DB_NAME="你的資料庫名稱"
node server.js

4. 重要:資料庫端的權限設定

即便程式碼寫好了,你還是必須在 Azure SQL Database 裡手動幫你的 App Service (或你的個人帳號) 建立權限:

SQL

-- 在 SQL 查詢編輯器執行
CREATE USER [你的-App-Service-名稱] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [你的-App-Service-名稱];

5. 最後打包 Docker 的提醒

因為我們新增了 mssql@azure/identity,請確保你的 Dockerfile 執行階段有包含 RUN npm install --production,或者直接複製整個 node_modules

你的基礎建設已經全部準備就緒:前端 Vite + 後端 Node.js + Docker 打包 + SQL 連線邏輯

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *