NodeJs - Express 中间件修改 Header: TypeError [ERR_INVALID_CHAR]: Invalid character in header content

背景

使用 Express 中间件进行数据代理方法,用户信息统一使用 Redis 缓存

  • user-redis
const user_redis = async function (req, res, next) {
    const token = req.headers['authorization']
    const user = await redis.client.getAsync(token).then((data) => {
        return data
    })
    // 给 header 添加用户信息,结果抛下面异常
    req.headers.user_info = user
    next()
}

异常信息

TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["user_info"]
    at ClientRequest.setHeader (_http_outgoing.js:473:3)
    at new ClientRequest (_http_client.js:193:14)
    ......

解决方法

参考:

https://github.com/expressjs/express/issues/3401

将 user 信息进行 base64 编码后,在应用层进行解码即可;

  • user_redis
const user_redis = async function (req, res, next) {
    const token = req.headers['authorization']
    const user = await redis.client.getAsync(token).then((data) => {
        return data
    })
    // 给 header 添加用户信息,结果抛下面异常
    req.headers.user_info = Buffer.from(user).toString('base64')
    next()
}
  • application
const user_str = req.headers.user_info
const userInfo = Buffer.from(user_str,'base64').toString()
npm ERR! code 1 npm ERR! path H:\nodejs\node_global\node_modules\windows-build-tools npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node ./dist/index.js Downloading python-2.7.15.amd64.msi npm ERR! [============================================>] 100.0% (0 B/s) npm ERR! Downloaded python-2.7.15.amd64.msi. Saved to C:\Users\Administrator\.windows-build-tools\python-2.7.15.amd64.msi. Downloading vs_BuildTools.exe npm ERR! [============================================>] 100.0% (0 B/s) npm ERR! Downloaded vs_BuildTools.exe. Saved to C:\Users\Administrator\.windows-build-tools\vs_BuildTools.exe. npm ERR! npm ERR! Starting installation... npm ERR! Downloading installers failed. Error: TypeError: 'process.env' only accepts a configurable, writable, and enumerable data descriptor npm ERR! at Function.defineProperty (<anonymous>) npm ERR! at Object.removePath (H:\nodejs\node_global\node_modules\windows-build-tools\dist\utils\remove-path.js:11:12) npm ERR! at Object.install (H:\nodejs\node_global\node_modules\windows-build-tools\dist\install\index.js:29:19) npm ERR! at H:\nodejs\node_global\node_modules\windows-build-tools\dist\start.js:17:19 npm ERR! at Object.download (H:\nodejs\node_global\node_modules\windows-build-tools\dist\download.js:35:5) npm ERR! at process.processTicksAndRejections (node:internal/process/task_queues:95:5) npm ERR! at async Object.aquireInstallers (H:\nodejs\node_global\node_modules\windows-build-tools\dist\aquire-installers.js:32:13) { npm ERR! code: 'ERR_INVALID_OBJECT_DEFINE_PROPERTY' npm ERR! } npm ERR! windows-build-tools will now exit. npm ERR! A complete log of this run can be found in: H:\nodejs\node_cache\_logs\2023-05-16T16_45_09_212Z-debug-0.log PS C:\Windows\system32>
05-17
### npm ERR_INVALID_CHAR 错误原因 `npm ERR_INVALID_CHAR` 的错误通常是因为某些字符在 HTTP 请求头中被认为是非法的,这可能是由于自定义请求头中的字段名称或值不符合标准所致。具体来说,在引用的内容中提到 `Invalid character in header content ["X-React-Native-Project-Root"]`[^1] 表明该问题可能源于某个工具或脚本向服务器发送了一个包含非法字符的头部。 这种错误也可能由以下几种情况引起: - **环境变量设置不当**:如果环境中存在不合法的字符串作为特定变量的值,则可能导致此错误。 - **第三方库冲突**:一些依赖项可能会尝试注入非标准的 HTTP 头部数据到网络请求中。 - **Node.js 或 npm 配置文件损坏**:当 `.npmrc` 文件或其他配置文件被意外修改时,也容易引发此类异常行为。 ### 解决方案 #### 方法一:检查并修正 .npmrc 和其他相关配置 确认本地项目的根目录下是否存在名为 `.npmrc` 的隐藏文件以及全局范围内的同名文件(一般位于用户的主目录)。如果有,请仔细审查其中每一行内容是否合理合规;特别是那些涉及 URL 参数或者特殊标记的部分。对于上述例子提及的情况,“X-React-Native-Project-Root”的键值对应该移除或替换为更合适的表达方式。 #### 方法二:调整 nrm 工具源管理器的行为逻辑 如果是通过 Node Registry Manager (`nrm`) 来切换不同镜像站点的话,那么可以参照第二种参考资料给出的办法——编辑其核心模块之一 cli.js 中关于存储位置的选择策略。原先是单纯依据 HOME 变量来定位用户家目录下的`.nrmrc`文档地址,现在改为兼容 Windows 平台上的 USERPROFILE 属性[^2]: ```javascript // 修改前 const NRMRC = path.join(process.env.HOME, '.nrmrc'); // 修改后 const NRMRC = path.join( process.env[ (process.platform === 'win32') ? 'USERPROFILE' : 'HOME' ], '.nrmrc' ); ``` #### 方法三:彻底清除旧版残留影响后再重新部署必要组件 鉴于第三则资料描述的经历表明有时候即使反复执行常规意义上的卸载操作也无法完全消除遗留痕迹从而达到修复目的的情形之下,建议采取更为激进的手法即先全面抹去所有关联软件包及其附属资源然后再逐一重建它们的过程。其中包括但不限于以下几个方面的工作事项[^3]: - 卸载当前版本的 Yarn 软件; - 清理干净 NPM 缓存区的数据记录; - 删除操作系统层面注册过的 NODE_PATH 类型环境参数设定; - 安装最新稳定发行版别的 NodeJS 运行时引擎实例; - 最终恢复先前已知可用状态下的 Yarn 实现形式。 ### 总结 综上所述,针对 `ERR_INVALID_CHAR` 类型的问题可以从多个角度出发寻找根本诱因所在,并据此制定相应的处理措施加以应对。无论是优化现有的配置选项还是升级基础架构都能够在一定程度上缓解甚至杜绝这类现象的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值