Node.js原生HTTP服务POST请求Body字符串匹配逻辑失效问题求助
问题根因
你的代码存在两个核心逻辑疏漏,导致token校验永远无法命中正确分支:
异步执行时序错位
Node.js内置HTTP模块的请求对象中,data(收到请求分片)、end(请求全部接收完成)事件都是异步触发的,代码实际执行流程为:
- 收到POST请求,初始化
body为空字符串 - 绑定
data事件的回调逻辑——此时回调不会立刻执行,只有当网络传输的请求数据分片到达时才会被触发 - 绑定完事件后,同步向下执行两个
body.includes("token")的判断逻辑:此时body还保持初始的空字符串状态,空字符串判断是否包含token必然返回false,自然永远进入未授权分支 - 等所有请求数据传输完成、触发
end事件时,你当初选择走哪个响应分支的逻辑早就执行完毕了——哪怕此时body里已经存了你传的token字符串,也不会重新触发校验逻辑
数据处理逻辑不严谨
在data事件回调中直接写body = data,存在两个隐患:
- 回调拿到的
data是Buffer二进制类型,直接赋值给本该存储字符串的变量,后续调用includes方法的行为和预期不一致 - 如果请求体较大被拆成多个网络分片传输,每次触发
data事件都会直接覆盖body的值,会丢失已经收到的内容
可正常运行的修正代码
const http = require('http') const server = http.createServer(function(request, response) { // 提前拦截非POST请求,减少分支判断 if (request.method !== 'POST') { response.writeHead(405) response.end('Method Not Allowed') return } const chunkList = [] // 收集所有网络分片 request.on('data', (chunk) => { chunkList.push(chunk) }) // 等所有数据接收完成后,再执行校验与响应逻辑 request.on('end', () => { // 拼接所有Buffer分片,转成UTF-8字符串 const body = Buffer.concat(chunkList).toString('utf8') if (body.includes("token")) { response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }) response.write(`${body}\n`) response.end('success') return } response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }) response.write(`${body}\n`) response.end('Not Auth. ') }) }) server.listen(3000)
现象解释
你之前能在未授权分支的回显里看到完整的token字符串,是因为end事件触发时,分片数据已经收集完成,此时执行的response.write(body)自然能拿到正确的请求内容——但这个操作发生的时候,你早就完成了分支判断,和实际收到的字符串内容没有关系,哪怕字符串完全匹配,也不会走已授权分支。
内容的提问来源于stack exchange,提问作者GLHF
相关产品推荐
相关产品推荐

