提问人:Ana Cláudia Faria 提问时间:10/24/2023 最后编辑:traynorAna Cláudia Faria 更新时间:10/24/2023 访问量:37
Fetch 只发生一次,或者如果我打开开发人员工具
Fetch only happens once or if I open developer tools
问:
我正在开发一个网站,该网站应该在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;
答:
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。我已经尝试过了,但使用该解决方案的地图上没有显示任何内容。我会研究一下,因为我也是一个新手,没有做这部分代码
评论