Node.js Express使用全局变量定义GET路由报404的解决方法
故障原因
你的GET路由是在服务启动阶段就完成注册的,注册路由时全局变量topic还是初始值空字符串,所以最终注册生效的GET路径实际是/posts/。
后续你在POST接口里修改全局topic的值,不会更新已经注册完成的路由规则,所以当你重定向到/posts/[实际传入的topic值]时,服务端没有匹配的路由,就会返回404状态码。
另外注意:用全局变量存单请求相关的参数本身就有逻辑问题,多用户并发请求时会出现变量值互相覆盖的情况,直接导致业务逻辑错乱。
修复方案
Express原生支持动态路由参数,不需要提前硬编码路径、也不需要用全局变量存路径值,直接在路由定义中用:参数名声明动态路径段即可,这一个路由就能匹配所有/posts/xxx格式的请求,还能直接从请求对象上拿到传入的topic值。
修改后的代码如下:
app.post(`/posts`,(req,res)=>{ // 直接从请求体取topic值做重定向即可,不需要存全局 const topic = req.body.ReadMore; res.redirect(`/posts/${topic}`); }); // 用:topic声明动态路径参数,匹配所有/posts/下的子路径GET请求 app.get(`/posts/:topic`, (req,res) => { // 通过req.params.topic获取URL中传入的实际topic值 const targetTopic = req.params.topic; // 可以根据targetTopic查询对应内容后再渲染页面 res.render('page', { topic: targetTopic }) })
这种写法一次注册就能适配所有不同topic的访问需求,完全符合你的业务场景。
内容的提问来源于stack exchange,提问作者Aryan Arya
相关产品推荐
相关产品推荐

