Node.js处理JSON纯文本编码及Postman纯文本POST请求解析问题
嘿,我来帮你搞定这两个Node.js相关的问题~
其实这个需求Node.js内置就有完美的解决方案——用JSON.parse()方法就行!它能把符合JSON语法规范的纯文本字符串直接转换成JavaScript对象(也就是你说的JSON数据)。
举个简单的例子:
// 模拟你拿到的JSON格式纯文本 const jsonText = '{ "name":"brad" , "address":"mystreet" }'; // 解析成可直接使用的JSON对象 const jsonData = JSON.parse(jsonText); // 现在就能直接访问对象属性啦 console.log(jsonData.name); // 输出:brad console.log(jsonData.address); // 输出:mystreet
要注意的是,纯文本必须严格遵循JSON语法规则(比如键名必须用双引号、不能有多余的尾逗号),否则JSON.parse()会抛出错误。如果不确定文本是否合法,可以用try-catch来捕获解析异常:
const invalidJsonText = '{ "name":"brad" , "address":"mystreet", }'; // 这里多了个尾逗号,不符合JSON规范 try { const jsonData = JSON.parse(invalidJsonText); console.log(jsonData); } catch (error) { console.error('JSON解析失败:', error.message); }
先帮你分析下问题原因:你现在控制台输出的{ '{ "name":"brad", "address":"mystreet" }': '' },说明body-parser把请求体当成x-www-form-urlencoded格式解析了。
因为Postman发送纯文本时,默认的Content-Type请求头不是application/json,而是text/plain;而你配置的bodyParser.json()只会处理Content-Type为application/json的请求,所以bodyParser.urlencoded()就把整个纯文本字符串当成了一个表单键,值为空,才出现了这个奇怪的输出。
给你两种解决方案,按需选择:
方案一:修改Postman请求配置(推荐)
直接让Postman发送标准的JSON请求,这样你的现有后端代码完全不用改:
- 打开Postman的Body标签页,选择
raw选项 - 在右侧的下拉菜单里选
JSON(别选Text) - 输入你的JSON内容
{ "name":"brad" , "address":"mystreet" } - 发送请求,Postman会自动把
Content-Type设为application/json,此时req.body就能直接拿到正确的对象啦!
方案二:修改Express代码,支持解析纯文本
如果必须发送text/plain格式的请求,你可以给body-parser添加文本解析中间件,然后手动把文本转成JSON:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // 添加text解析器,处理Content-Type为text/plain的请求 app.use(bodyParser.text({ type: 'text/plain' })); app.post('/api/test', function (req, res) { let contact; // 根据请求的Content-Type做不同处理 if (req.is('application/json')) { contact = req.body; } else if (req.is('text/plain')) { // 把纯文本转成JSON对象 try { contact = JSON.parse(req.body); } catch (err) { return res.status(400).send('无效的JSON格式文本'); } } else { return res.status(400).send('不支持的请求格式'); } console.log(contact); res.send('数据解析成功'); });
这样不管是发送application/json还是text/plain的请求,后端都能正确解析出你需要的JSON对象了。
内容的提问来源于stack exchange,提问作者ekologi

