Fetch 只发生一次,或者如果我打开开发人员工具

Fetch only happens once or if I open developer tools

提问人:Ana Cláudia Faria 提问时间:10/24/2023 最后编辑:traynorAna Cláudia Faria 更新时间:10/24/2023 访问量:37

问:

我正在开发一个网站,该网站应该在mongoDB上提供一些报告,并根据这些报告的位置在地图上放置标记。 问题是:当我打开网站时,这种情况只会发生一次(在本地,有时在线上根本不会发生),并且为了进行获取,我注意到我必须打开开发人员工具。如果我这样做,标记将出现。 我不明白是什么导致了这个问题,但在网上进行了一些挖掘后,我得出了一些假设:

  • console.log - 我现在已经将它们全部删除了
  • cache - 我安装了 nocache

问题仍然存在。有人可以帮我了解我做错了什么以及如何解决吗?

获取

    const [markers, setMarkers] = useState<Array<GeoReport>>([]);
    const fetchReports = async () => {
        const response = await fetch(process.env.REACT_APP_BACKEND + '/api/report');
        const json = await response.json();
        json.forEach((report: GeoReport) => {
            markers.push({
                id: report.id,
                lat: report.lat,
                lng: report.lng,
                adress: report.adress,
                placeId: report.placeId,
                surveys: report.surveys,
                fileName: report.fileName,
                imgName: report.imgName
            });
        });
        setMarkers([...markers]);
        dispatch.setMap(
            // eslint-disable-next-line @typescript-eslint/no-explicit-any
            markers.reduce((acc: any, curr: any) => {
                (acc[curr.adress] = acc[curr.adress] || []).push(curr);
                return acc;
            }, {} as { [key: string]: GeoReport[] }),
        );
        
    };

服务器

import express from 'express';
import * as Colors from 'colors.ts';
import cors from 'cors';
import bodyParser from 'body-parser';
import nocache from 'nocache';

import { connectDB } from './database/db';
import { errorHandler } from './middleware/errorMiddleware';
import { FRONTEND_URL, PORT } from './utils/config';
import reportRoutes from './routes/reportRoutes';
import driveRoutes from './routes/driveRoutes';
import driveImageRoutes from './routes/driveImageRoutes';
// Apply Colors to consoleLogs
Colors.colors('', '');

// Connection to DB
export const db = async (): Promise<void> => {
    await connectDB();
};

void db();

const app = express();
app.use(
    bodyParser.urlencoded({
        extended: true,
    })
);
app.use(nocache());
app.set('etag', false);

const allowedOrigins = FRONTEND_URL;

// const options: cors.CorsOptions = {
//     origin: allowedOrigins,
// };

app.use(
    cors({
        origin: allowedOrigins,
    })
);
app.use(express.json());

app.use((req, res, next) => {
    //console.log(req.path, req.method);
    next();
});

app.use('/api/report', reportRoutes);
app.use('/api/drive', driveRoutes);
app.use('/api/driveimage', driveImageRoutes);

app.use(errorHandler);

app.listen(PORT, () =>
    console.log(`App listening on port ${PORT}`.green.underline.bold)
);

报告路由

import express from 'express';

import {
    getAllreportsHandler,
    createreportHandler,
    getreportHandler,
} from '../controllers/reportController';
const reportRoutes = express.Router();

reportRoutes.route('/').get(getAllreportsHandler).post(createreportHandler);
reportRoutes.route('/:id').get(getreportHandler);

export default reportRoutes;
reactjs node.js 快速 提取 API 开发人员工具

评论


答:

1赞 Taymer 10/24/2023 #1

我想你正在使用 React 前端。
一个潜在的问题是在使用标记列表时,因为您正在直接修改状态

const [markers, setMarkers] = useState<Array<GeoReport>>([]); 

您正在修改标记,然后使用
您应该使用类似的东西:
markers.push(...)setMarkers([...markers]);

        const newMarkers = json.map((report: GeoReport) => ({
                id: report.id,
                lat: report.lat,
                lng: report.lng,
                adress: report.adress,
                placeId: report.placeId,
                surveys: report.surveys,
                fileName: report.fileName,
                imgName: report.imgName
            })
        );
        setMarkers(newMarkers);

这里有一个很好的解释 Stackoverflow 答案

评论

0赞 Ana Cláudia Faria 10/24/2023
感谢您的输入@Taymer。我已经尝试过了,但使用该解决方案的地图上没有显示任何内容。我会研究一下,因为我也是一个新手,没有做这部分代码