在NestJS应用中集成PeerServer遇/myapp路径404问题求助
NestJS集成PeerServer的问题解决
问题分析
核心问题是路径映射逻辑不匹配:
- PeerServer配置了
path: '/myapp',意味着它只会处理以/myapp为前缀的内置路由(比如PeerJS的握手、信令接口) - 控制器中把
/peer-server/myapp替换为/myapp后,PeerServer会将其识别为根路径,无法匹配自身基于/myapp的内置路由,因此返回404 - 自定义的
/test接口能正常响应,是因为你直接在PeerServer实例上注册了该路由,不受path选项的约束
解决方案
推荐两种实现方式,选其一即可:
方式一:通过Nest中间件直接挂载(更简洁)
去掉控制器,直接将PeerServer作为中间件挂载到指定路径:
- 修改
peer-server.service.ts:
import { Injectable } from '@nestjs/common'; import { NestExpressApplication } from '@nestjs/platform-express'; import { ExpressPeerServer, PeerServerEvents } from 'peer'; import { Express } from 'express'; @Injectable() export class PeerServerService { peerServer: Express & PeerServerEvents; enablePeerServer(app: NestExpressApplication) { this.peerServer = ExpressPeerServer(app.getHttpServer(), { path: '/myapp', // PeerServer自身的路径前缀 }); // 将PeerServer挂载到Nest的/peer-server路径下 app.use('/peer-server', this.peerServer); // 自定义测试接口(可选) this.peerServer.get('/test', (req, res) => { res.send('hello'); }); } }
- 删除
peer-server.controller.ts(不再需要)
此时请求/peer-server/myapp会直接被PeerServer处理,自定义接口/peer-server/test也能正常响应。
方式二:调整控制器的路径替换逻辑
如果需要保留控制器转发,修改路径处理逻辑并调整PeerServer的path配置:
- 修改
peer-server.service.ts,移除path选项(或设为空字符串):
enablePeerServer(app: NestExpressApplication) { this.peerServer = ExpressPeerServer(app.getHttpServer(), { // 去掉path配置,或设为path: '' }); this.peerServer.get('/test', (req, res) => { res.send('hello'); }); }
- 修改
peer-server.controller.ts的URL替换逻辑:
@All('*') server( @Req() request: Request, @Res() response: Response, @Next() next: NextFunction, ) { // 直接去掉/peer-server前缀,保留完整的后续路径 request.url = request.url.replace('/peer-server', ''); this.peerServerService.peerServer(request, response, next); }
此时请求/peer-server/myapp会被替换为/myapp,PeerServer没有自身的path前缀,就能正确匹配内置路由。
验证
启动应用后:
- 访问
/peer-server/myapp应返回PeerServer的正常响应(而非404) - 访问
/peer-server/test仍能返回hello
内容的提问来源于stack exchange,提问作者Adriel
相关产品推荐
相关产品推荐

