You need to enable JavaScript to run this app. Node.js原生HTTP服务POST请求Body字符串匹配逻辑失效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Node.js原生HTTP服务POST请求Body字符串匹配逻辑失效问题求助

问题根因

你的代码存在两个核心逻辑疏漏,导致token校验永远无法命中正确分支:

异步执行时序错位

Node.js内置HTTP模块的请求对象中,data(收到请求分片)、end(请求全部接收完成)事件都是异步触发的,代码实际执行流程为:

  1. 收到POST请求,初始化body为空字符串
  2. 绑定data事件的回调逻辑——此时回调不会立刻执行,只有当网络传输的请求数据分片到达时才会被触发
  3. 绑定完事件后,同步向下执行两个body.includes("token")的判断逻辑:此时body还保持初始的空字符串状态,空字符串判断是否包含token必然返回false,自然永远进入未授权分支
  4. 等所有请求数据传输完成、触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 08:54:03