Node.js Express报Header name must be a valid HTTP token错误
错误产生原因
你误用了Express的响应方法:res.append()的作用是追加HTTP响应头,它的第一个参数必须传入合法的HTTP头字段名(仅允许字母、数字、连字符、下划线等有限字符,不能包含斜杠、冒号这类特殊符号)。你当前直接把拼接好的URL字符串作为第一个参数传入res.append(),Node.js在做HTTP头合法性校验时,发现传入的内容不符合HTTP头命名规范,就抛出了ERR_INVALID_HTTP_TOKEN错误。
正确实现方式
你需要的是把拼接好的URL作为响应体内容返回给请求方,而不是设置响应头,应该使用res.send()方法完成响应,同时注意拼接URL时补上HTTP协议前缀,避免返回的地址缺少协议无法直接使用。
修正后的完整路由代码如下:
const app = require('./app'); const config = require('./config/config'); const logger = require('./config/logger'); let server; server = app.listen(config.port, config.host, () => { logger.info(`Listening to port ${config.port} on host ${config.host}`); }); // 原有/:sid/:ui路由补充响应逻辑,避免请求挂起 app.get('/:sid/:ui', (req, res, next) => { console.log('OK') res.send(`Matched route, sid: ${req.params.sid}, ui: ${req.params.ui}`) }) app.get('/url', (req, res, next) => { console.log('inside') // 拼接完整自托管URL,作为响应体直接返回 const targetUrl = `http://${config.host}:${config.port}/sid/ui` res.send(targetUrl) })
修正后重启服务,访问http://127.0.0.1:3005/url就会得到你预期的返回结果:
http://127.0.0.1:3005/sid/ui
附Express常用响应方法的区别,避免后续混用:
res.append()/res.set():仅用于设置HTTP响应头,参数格式为(头字段名, 头字段值)res.send()/res.json():用于返回业务响应体,也就是接口实际返回给调用方的内容
内容的提问来源于stack exchange,提问作者WISHY
相关产品推荐
相关产品推荐

