Express中对非/api/login、/api/signup路由认证时正则报错问题
解决Express中JWT认证路由的正则语法错误
你遇到的这个错误是因为路由正则的写法不符合Express的解析规则,导致生成了无效的正则表达式。
问题根源
你把正则表达式写成了字符串形式(用引号包裹):
app.use('/^\/api\/(?!signup|login).*$/', passport.authenticate('jwt', { session: false }));
Express对路径字符串有自己的处理逻辑:它会把这个字符串转换成内部的正则表达式,你写的^、$和转义的/会被当成普通字符,再加上Express自动追加的匹配规则,最终生成了像/^\/^\/api\/(?:?!signup|login)\.(.*)$\/?(?=\/|$)/这样的无效正则——里面重复的^锚点就是触发“Nothing to repeat”错误的核心原因。
正确的写法
直接传递正则字面量(去掉引号,用/.../直接包裹正则规则):
app.use(/^\/api\/(?!signup|login).*$/, passport.authenticate('jwt', { session: false }));
这样Express会直接使用你定义的正则,不会额外添加多余的匹配规则,就能精准匹配所有/api/开头、但排除/api/login和/api/signup的路由。
快速验证
可以简单确认这个正则的匹配范围:
- 会匹配的路由:
/api/profile、/api/posts/456 - 不会匹配的路由:
/api/login、/api/signup、/static/index.html
内容的提问来源于stack exchange,提问作者nipek
相关产品推荐
相关产品推荐

