当前位置: 首页 > 知识库问答 >
问题:

Express不加载页面,只返回json

丁恩
2023-03-14

当重新加载页面后,服务器只返回json而不是该页面时,就会出现问题

我正在使用React和return static files from build folder,还有express handles路由,当运行localhost时只在生产模式下复制一切正常

app.use('/auth', authRoutes);
app.use('/user', userRoutes);
app.use(['/dota2', '/csgo', '/lol'], generalRoutes);

if (process.env.REACT_APP_ENV === 'production') {
  console.log('Production is running');
  app.use('/', express.static(path.join(__dirname, '../build')));
  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, '../build', 'index.html'));
  });
}

有路线

const router = Router();

router.get('/live', liveMatches);
router.get('/upcoming', upcomingMatches);
router.get('/past', pastMatches);
router.get('/:matchId', getMatchById);
router.get('/opponents/:tournamentId', opponents);
router.post('/past-team-matches', pastTeamMatches);

您可以访问mySite,您将看到json作为结果,但是如果您清除URL中的matchId并单击任何匹配,页面将正常加载

还有react-router

<ServiceRoute
            key={key}
            path={['/dota2', '/csgo', '/lol']}
            exact
            access
            component={Matches}
          />
          <ServiceRoute
            key={key}
            path={['/dota2/:matchId', '/csgo/:matchId', '/lol/:matchId']}
            exact
            access
            component={MatchInfo}
          />

共有1个答案

赵驰
2023-03-14

让我们按照express在这种情况下所做的路线匹配:

  1. 查找/dota2/566624时,它将在此处匹配:app.use(['/dota2','/csgo','/lol'],generalRoutes);并返回JSON.
  2. 查找/dota2时,它与app.use(['/dota2','/csgo','/lol'],generalRoutes);不匹配,因此它将继续向下运行,直到与app.get('*',(req,res)=>{匹配,为React页面提供服务。

我在这里看到的问题是,您在React上为API和前端路由使用了完全相同的路由。 理想情况下,当从同一服务器为API和前端应用程序提供服务时,您应该为API路由加前缀,这样它们就不会与前端路由发生冲突。 假设您在API路由前添加:/API。 现在你我们有:

app.use('/api/auth', authRoutes);
app.use('/api/user', userRoutes);
app.use(['/api/dota2', '/api/csgo', '/api/lol'], generalRoutes);

// ... everything is the same down here
  1. /api/dota2/566624。 将与在第一次加载时返回JSON的端点匹配。
  2. /dota2/566624。 将不匹配JSON端点,并跟踪到加载React应用程序的'*'路由,以后,一旦加载了应用程序,该路由将由您在React应用程序上使用的路由器处理。

不要像我在上面的示例中所做的那样添加前缀,使用您一直用于此目的的常量router=router();。 我对前缀进行了硬编码,这样我可以使示例简短。

最后一个问题是:为什么在发展方面没有出现这种情况? 我没有所有的信息,但是我可以看到,您正在从不同于运行API的服务器上为前端应用程序提供服务; 在这种情况下,您不会有路由冲突,因为它们是来自不同端口的服务器,例如在localhost:8080上服务的前端和在localhost:5000上服务的API。

我希望这能帮上忙! 如果您需要信息,请评论!

 类似资料:
  • 我添加了快速结账按钮到我的页面,并使用客户端代码设置服务器端进程: 我使用服务器端。NET SDK通过通用处理程序创建和处理支付,它工作正常,但是在调用支付执行后,整个页面被重新加载。 我想通过执行监听器处理结果/错误-paypal。要求post(执行付款URL…)使用定义的回调。然后()和。catch()方法。 用于贝宝的互动演示https://developer.paypal.com/demo

  • 本文向大家介绍js返回前一页刷新本页重载页面,包括了js返回前一页刷新本页重载页面的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我知道某些网页PhantomJS /CasperJS无法打开,我想知道这是否是其中之一:给出错误:PhantomJS无法打开页面status = fail。 我尝试忽略ssl错误并更改了用户代理,但是我不确定如何确定要使用哪个代理。 我现在正在做的只是在哪里进行Casper的基本设置; 问题答案: 该问题可能与最近发现的SSLv3漏洞(POODLE)有关。网站所有者被迫从其网站中删除S

  • 我的express服务器运行在端口3000上,反向代理是nginx。 ip总是返回127.0.0.1,而req.ips返回一个空数组

  • ⚠️ 只有生产环境才有此功能 ⚠️ Examples Prefetching Next.js 有允许你预加载页面的 API。 用 Next.js 服务端渲染你的页面,可以达到所有你应用里所有未来会跳转的路径即时响应,有效的应用 Next.js,可以通过预加载应用程序的功能,最大程度的初始化网站性能。查看更多. Next.js 的预加载功能只预加载 JS 代码。当页面渲染时,你可能需要等待数据请求。

  • 我对selenium webdriver有问题,如果有人能帮助我,我将非常感激 环境: 硒服务器独立-2.31.0.jar / 硒-服务器-独立-2.35.0.jar IE驱动程序服务器.exe(已尝试版本 2.28 - 2.35) 示例代码: 问题:修复这些问题都会对我有所帮助 href。sendKeys()成功模拟用户单击,但不等待页面加载。 href。click()无法模拟用户单击,但成功等

  • Selenium的SafariDriver似乎不会等待网页加载。我的测试如下: 如果您使用或运行此功能,它将正常运行,即搜索“您好世界”,然后在结果页面上转到图像结果。 使用,它会失败: 找不到的元素是“Images”,因为页面在运行该语句之前没有加载。 这是预期行为吗?我应该是狩猎旅行的特例吗?

  • 我必须从网页上阅读某个领域的内容。有人告诉我,我需要获取整个页面,然后从html内容中提取文本。我使用以下程序来获取所需的页面html内容。现在的问题是,这个网页需要几秒钟的时间来加载我想要读取的实际文本值,即使其他静态页面组件都是在前面加载的。我的程序在静态组件加载之后,但在我的值加载之前,返回html内容。因此,我得到的最终HTML具有页面加载过程pic,而不是实际值。有没有人可以指导我在这个