我正在尝试让静态 Web 应用程序通过 Azure 函数应用程序中的 HTTP 触发器与 SQL 数据库进行通信。
当我尝试在网站上提交表单时,收到 500 内部服务器错误。这是浏览器控制台的错误:
----------
POST
script.js:14
https://totallyfunfunctionapp.azurewebsites.net/api/HttpTrigger1?
net::ERR_ABORTED 500 (Internal Server Error)
(anonymous) @ script.js:14
----------
script.js:36
Error: Error: Network response was not ok Internal Server Error
at script.js:23:19
----------
前端代码托管在 GitHub 上并部署到 Azure。
网络应用程序很简单:带有提交按钮的单行文本输入。我的目标是将输入的文本存储在 SQL 数据库中。
这是我正在使用的前端 JavaScript:
document.getElementById('submitButton').addEventListener('click', function() {
var textInput = document.getElementById('textInput').value;
var result = document.getElementById('result');
// URL of your Azure Function
const functionUrl = 'https://totallyfunfunctionapp.azurewebsites.net/api/HttpTrigger1?';
// Create the request body
const requestBody = {
textInput: textInput
};
// Make the request to your Azure Function
fetch(functionUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestBody)
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.text(); // Use text() to handle non-JSON responses
})
.then(text => {
try {
const data = JSON.parse(text); // Parse the text response as JSON
result.textContent = 'Data received: ' + JSON.stringify(data);
} catch (error) {
result.textContent = 'Error parsing JSON: ' + error.message;
}
})
.catch(error => {
console.error('Error:', error);
result.textContent = 'Error: ' + error.message;
});
});
这是 Function App HTTP 触发器的代码:
const sql = require('mssql');
const config = {
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
server: process.env.DB_SERVER,
database: process.env.DB_NAME,
options: {
encrypt: true,
trustServerCertificate: false
}
};
module.exports = async function (context, req) {
context.log('Function execution started');
try {
await sql.connect(config);
const result = await sql.query`SELECT * FROM Entries`;
context.res = {
status: 200,
body: result.recordset.length > 0 ? result.recordset : { message: 'No data found' },
headers: {
'Content-Type': 'application/json'
}
};
} catch (err) {
context.log.error('Error encountered:', err);
context.res = {
status: 500,
body: JSON.stringify({ error: `Error connecting to database: ${err.message}` }),
headers: {
'Content-Type': 'application/json'
}
};
}
};
我已将 Function App 可能的出站 IP 地址添加到数据库的防火墙规则中。
我刚开始将 Azure Functions 与数据库集成,并尝试寻找解决方案,但没有任何运气。任何有关可能出现问题的指导或资源将不胜感激!
关于错误
POST 500 (Internal Server Error)
,您应该检查服务器日志或浏览器中的控制台日志。在尝试您的代码时,我遇到了 CORS 错误,如下图所示:
要解决此问题,请将以下内容添加到您的 本地设置文件
local.settings.json
:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "node"
},
"Host": {
"CORS": "*"
}
}
此外,在 Azure 中函数应用的 CORS 选项卡中添加上述 URL 的 CORS 设置:
确保将
index.html
放入 src
文件夹中。
我参考了这个 MSDOC 来使用 Azure Static Web Apps 构建静态站点,不使用 framework:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="Hello.css">
<title>Submit Form</title>
</head>
<body>
<main>
<h1>Submit Form</h1>
<input type="text" id="textInput" placeholder="Enter text">
<button id="submitButton">Submit</button>
<p id="result"></p>
</main>
<script src="script.js"></script>
</body>
</html>
请参阅此 MSDOC 了解 Azure 静态 Web 应用 CLI 配置。
本地输出:
带有 Out API 的 Yml 文件:
app_location: "./src"
api_location: ""
output_location: "."
我参考了此 MSDOC,在不使用框架的情况下将 API 添加到具有 Azure Functions 的 Azure 静态 Web 应用程序。
带有 API 本地化的 Yml 文件:
app_location: "./src"
api_location: "./api"
output_location: "."
Azure 静态 Web 应用程序输出:
Azure SQl 数据示例表视图: