【发布时间】:2022-10-05 08:50:21
【问题描述】:
我有一个使用 React 前端和 Node.js 后端的 Web 应用程序(连接到 MS SQL 数据库。)
在应用程序中,每次页面加载时,前端都会向服务器上的 API 后端发送一些请求(通过 Axios)。大多数情况下(95%)它们都完美地处理,但可能有 5% 的时候,它会导致“Aborted”消息并且应用程序服务器返回 500 错误。有时这些请求是非常少量的数据(比如只返回几个数字的计数查询,远小于 1KB - 所以大小不是问题)。
似乎浏览器以某种方式告诉服务器“哦,实际上我需要这个”并且服务器取消它以前的结果并处理下一个请求。但大多数情况下,它们都会被退回。
这是 React 上下文的示例:
import React, { useCallback, createContext } from 'react'
import axios from 'axios'
import { useSnackbar } from 'notistack'
export const PlanContext = createContext()
export default function PlanProvider(props) {
const { enqueueSnackbar } = useSnackbar()
const [sampleData, setSampleData] = useState([])
const sampleRequest = useCallback(
async (dateInput) => {
try {
const { data } = await axios.get(`/api/sample`, {
params: { dateInput: dateInput, },
})
setSampleData(data)
} catch (error) {
enqueueSnackbar(`Error: ${error.message}`, { variant: 'error' })
}
}, [enqueueSnackbar])
return (
<Plan.Provider
value={{
sampleRequest,
sampleData,
}}
>
{props.children}
</Plan.Provider>
)
}
这是 Node.JS 控制器的示例:
const sql = require('mssql')
const config = require('../config/db')
async function sampleRequest(req, res) {
const { dateInput } = req.query
let pool
try {
pool = await sql.connect(config)
const {recordset} = await pool.request()
.input('dateInput', sql.Date, dateInput).query`
SELECT * FROM DATATABLE WHERE StatusDate = @dateInput
`
res.json(recordset)
} catch (error) {
console.log('ERROR: ', error.message, new Date())
res.status(500).json({message: error.message})
} finally {
if (pool) {
try {
await pool.close()
} catch (err) {
console.error("Error closing connection: ",err);
}
}
}
}
module.exports = {
sampleRequest
}
并且有多个上下文和多个控制器提取各种数据。
在浏览器控制台(Chrome 开发者工具)中:
我与 async / await 设置有什么混淆吗?我通常可以通过不断刷新页面 (F5) 来重新创建错误。
【问题讨论】: