既然你的開發環境已經串接成功,接下來就是把 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 非常聰明,它會依照環境切換驗證方式:
- 在 Local:它會嘗試抓取你電腦上
az login的身分。請確保你在 PowerShell 執行過az login並有權限存取該資料庫。 - 在 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 連線邏輯。