【问题标题】:Multiple simultaneous Node.js data requests occasionally resulting in "aborted" error (Express, React)多个同时的 Node.js 数据请求偶尔会导致“中止”错误(Express、React)
【发布时间】: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
  }

并且有多个上下文和多个控制器提取各种数据。

这是 Node.JS 服务器上记录的错误示例:

在浏览器控制台(Chrome 开发者工具)中:

我与 async / await 设置有什么混淆吗?我通常可以通过不断刷新页面 (F5) 来重新创建错误。

【问题讨论】:

    标签: node.js reactjs express


    【解决方案1】:

    对于那些寻找答案的人,我遇到了类似的问题,我相信这是因为您在每次请求或调用函数时都打开和关闭连接池。在函数之外实例化连接池,然后调用 pool.request()。我见过的常见做法是在您的数据库文件中拥有连接池并导出池对象,然后在您的路由中使用它。

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多