我使用 Svelte 框架部署了 Azure Static Web App (SWA)。 SWA 连接到 Azure SQL 数据库并使用 GraphQL 端点来查询数据库。我想用 SQL 查询替换 GraphQL 查询,因为当前查询“非常慢”。在约 21000 行的表上,第一个查询大约需要 10-11 秒。后续查询仍会执行大约 5-6 秒(连接可能已缓存)。 所以我决定使用
mssql 包来加快查询速度:
const sql = require('mssql');
const config = {
server: '<server_name>.database.windows.net',
database: '<database_name>',
user: process.env.USER,
password: process.env.PASSWORD,
options: {
encrypt: true
}
};
onMount(async () => {
const result = await sql
.connect(config)
.then(() => sql.query('SELECT * FROM <my_table>'))
.then((result) => result.recordset)
.catch((error) => console.warn('Error querying database: ', error));
console.log(result);
});
不幸的是,我在导入阶段遇到了错误。
未捕获(承诺中)ReferenceError:未定义需求
这是有道理的,因为 Svelte 在
module
文件下使用类型
commonjs
而不是 package.json
:{
...
"type": "module",
"dependencies": {
...
}
}
因此,我将
const sql = require('mssql');
替换为
import sql from 'mssql';
import 语句。但我在构建过程中收到警告:
(!)有些块修改后大于 500 kB。如果我忽略此警告,则会出现以下错误:
ReferenceError:缓冲区未定义
Skipping Large chunks while running "Npm run build"我找到了
答案,它通过更新 vite.config.js
文件修复了警告。但是,在导入过程中我收到另一个“500 内部服务器错误”并显示以下错误消息:
是否有一种简单的方法可以使用
mssql
包,而在导入语句期间无需太多解决方法?
mssql
包连接数据库的简单替代方案。诀窍是
使用 Azure Functions 将 API 添加到 Azure 静态 Web 应用,导入/使用
mssql
包,然后通过 REST API 公开它。生成 API 最简单的方法是安装两个 VSCode 扩展:
在项目根目录创建一个
api
Azure Static Web Apps: Create HTTP Function....
Select a language
JavaScript在
Select a programming model
型号 V4在
Provide a function name
databaseEndpoint
api
文件夹。安装
mssql
软件包:cd api && npm install mssql
现在,我们可以使用
src/functions/databaseEndpoint.js
文件中的包了:
const { app } = require('@azure/functions');
const sql = require('mssql');
const config = {
server: '<server_name>.database.windows.net',
database: '<database_name>',
// The environment variables can be stored under the `api/local.settings.json` file
user: process.env.USER,
password: process.env.PASSWORD,
options: {
encrypt: true
}
};
app.http('databaseEndpoint', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
return await sql
.connect(config)
.then(() => sql.query('SELECT * FROM <my_table>'))
.then((result) => ({ jsonBody: result.recordset }))
.catch((error) => ({ jsonBody: `Error querying database: ${error}` }));
}
});
最后,我们可以在 Svelte (
+page.svelte
) 应用程序中使用创建的 API:
<script>
import { onMount } from 'svelte';
onMount(async () => {
const result = await fetch('api/databaseEndpoint')
.then((response) => response.json())
.catch((error) => console.warn('Error at fetching databaseEndpoint endpoint: ', error));
console.log(result);
});
</script>
使用以下命令构建并模拟 SWA:
npm run build
swa start build --api-location api
通过替换 GraphQL 端点,我获得了显着的性能。从 Azure Function 端点获取数据仅需约 1 秒(加速 5 倍)。
部署
api_location
文件中添加
azure-pipelines.yaml
: - task: AzureStaticWebApp@0
inputs:
azure_static_web_apps_api_token: $(AZURE_STATIC_WEB_APPS_API_TOKEN_GRAY_WAVE_014164E03)
app_location: '/'
api_location: 'api'
output_location: 'build'