如何用Node.js和Express读取JS发送的XMLHttpRequest POST请求负载?
首先得给你的客户端代码提个小修正——你的xhr.send()直接传了对象,但XMLHttpRequest的send()方法对于JSON格式的请求体,需要传JSON字符串而不是原生对象,不然服务端会解析失败。所以客户端那边要改成这样:
setInterval(() => { var xhr = new XMLHttpRequest(); xhr.open('POST', "../getchat", true); xhr.onreadystatechange = (e) => { if (xhr.readyState == 4 && xhr.status == 200) { var response = JSON.parse(xhr.responseText); document.getElementById("chat").innerHTML = ""; for (let i = 0; i < response.length; i++) { const element = response[i]; document.getElementById("chat").innerHTML += "<p>" + element + "</p>"; } } }; xhr.setRequestHeader("Content-Type", "application/json"); // 关键修正:把对象转为JSON字符串 xhr.send(JSON.stringify({username: "#{username}", password: "#{password}"})); }, 3000);
接下来看服务端(Node.js + Express)的处理步骤:
服务端实现步骤
1. 初始化项目并安装依赖
如果还没创建Express项目,先执行以下命令初始化并安装依赖:
npm init -y npm install express
2. 配置JSON请求体解析中间件
从Express 4.16.0版本开始,框架自带了express.json()中间件,专门用来解析Content-Type: application/json格式的请求体。你需要在入口文件中配置这个中间件:
3. 编写POST路由处理请求
创建/getchat的POST路由,通过req.body就能直接获取客户端发送的username和password参数。
完整的服务端示例代码如下:
const express = require('express'); const app = express(); const port = 3000; // 可根据你的需求修改端口号 // 配置JSON解析中间件,处理Content-Type为application/json的请求体 app.use(express.json()); // 处理POST请求到/getchat接口 app.post('/getchat', (req, res) => { // 从req.body中提取客户端发送的参数 const { username, password } = req.body; // 这里可以添加你的业务逻辑,比如验证账号、查询聊天记录等 console.log(`收到请求:用户名=${username},密码=${password}`); // 示例返回聊天数据(匹配客户端的渲染逻辑) res.json(['欢迎回来!', '这是一条新消息', '系统通知:服务正常运行']); }); app.listen(port, () => { console.log(`服务器运行在http://localhost:${port}`); });
核心逻辑说明
- 客户端设置
Content-Type: application/json,明确告诉服务端请求体的格式; express.json()中间件会自动读取请求体内容,将其解析为JavaScript对象并挂载到req.body上;- 你在路由处理函数中直接通过
req.body.username和req.body.password就能拿到客户端传递的参数。
内容的提问来源于stack exchange,提问作者skholm
相关产品推荐
相关产品推荐

