Nodejs Express 解析 json 格式 post 数据

Nodejs Express 解析 json 格式 post 数据

node.js 下著名web框架 express ,对于解析json格式数据之前低版本需要依赖 bodyParser . 后来的版本把 bodyParser 继承进去. 使用的时候需要在express 配置项里 user(express.bodyParser({ keepExtensions: true, uploadDir: ‘/tmp’ }))

如下代码:

var express = require('express'),
    app = express();

app.configure(function () { app.use(express.bodyParser({ keepExtensions: true, uploadDir: ‘/tmp’ })); });

Express 升级到4.x版本以后

升级以后的Express 所有的依赖包都拿出来了. 所以,如果你用了 Express 4.x 的某个版本来解析 json 方式的post请求数据 需要安装 body-parser

npm install body-parser

如果你的接口要求post 上来的数据格式是这样的:

{"data":{"name":"一介布衣","url":"http://yijiebuyi.com"}}

后端express 进过 bodyParser 的解析后,可以这样读取到数据

req.body.data.name    获取到  一介布衣
req.body.data.url      获取到 http://yijiebuyi.com 
这里是有前提的,客户端请求接口时必须指名请求头类型 Content-Type=application/json

bodyParser 发现这样类型的请求头后,会自动将 body 里的 json 格式数据正确解析,否则 req.body.data 为 undefined

传统的服务器端语言可能会接收post上传的流,然后转成字符串最后在格式化成 json ,这样加不加application/json 请求头都是没有问题的

但是Express 中间件在解析body中的post参数会检查 Content-Type 类型,所以没有指定正确格式导致中间件解析参数出错.

那如何处理呢?

因为好多地方都在调用你的接口,你无法保证所有的人都在请求头里面加了 Content-Type=application/json

解决思路是:

服务器端 先用 req.body.data 参数获取参数,如果成功,说明 bodyParser 正确解析了json 参数. 还是按照之前的方法读取.

如果 req.body.data 参数无值或者undefined 那么我们也用流来读取post 数据,然后转成字符串再解析成 json 格式来使用. 直接上代码

app.post('/post', function (req, res) {
    if (req.body.data) {
        //能正确解析 json 格式的post参数
        res.send({"status": "success", "name": req.body.data.name, "url": req.body.data.url});
    } else {
        //不能正确解析json 格式的post参数
        var body = '', jsonStr;
        req.on('data', function (chunk) {
            body += chunk; //读取参数流转化为字符串
        });
        req.on('end', function () {
            //读取参数流结束后将转化的body字符串解析成 JSON 格式
            try {
                jsonStr = JSON.parse(body);
            } catch (err) {
                jsonStr = null;
            }
            jsonStr ? res.send({"status":"success", "name": jsonStr.data.name, "url": jsonStr.data.url}) : res.send({"status":"error"});
        });
    }
});

13 回复

Node.js Express 解析 JSON 格式 POST 数据

在使用 Node.js 和 Express 框架处理 JSON 格式的 POST 数据时,确保正确解析这些数据是非常重要的。本文将介绍如何在不同版本的 Express 中实现这一功能。

Express 3.x 及以下版本

在较旧版本的 Express(如 3.x)中,内置了 bodyParser 中间件,可以直接用于解析 POST 请求中的 JSON 数据。以下是一个示例:

var express = require('express');
var app = express();

app.configure(function () {
    app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/tmp' }));
});

app.post('/post', function (req, res) {
    res.send({
        status: 'success',
        name: req.body.data.name,
        url: req.body.data.url
    });
});

app.listen(3000);

在这个例子中,我们通过 app.use(express.bodyParser()) 启用了 bodyParser 中间件,并在 POST 路由中访问 req.body 来获取解析后的数据。

Express 4.x 及以上版本

从 Express 4.x 开始,bodyParser 不再是内置的中间件,而是作为一个独立的 npm 包提供。因此,我们需要先安装 body-parser

npm install body-parser

然后,我们可以使用 body-parser 来解析 POST 请求中的 JSON 数据:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

// 使用 body-parser 中间件
app.use(bodyParser.json());

app.post('/post', function (req, res) {
    res.send({
        status: 'success',
        name: req.body.data.name,
        url: req.body.data.url
    });
});

app.listen(3000);

在这个例子中,我们通过 app.use(bodyParser.json()) 启用了 JSON 格式的请求体解析。

处理未设置 Content-Type 的情况

有时客户端可能不会正确设置 Content-Typeapplication/json,这会导致 bodyParser 无法正确解析数据。为了处理这种情况,可以在代码中添加额外的逻辑来读取 POST 请求的数据流并手动解析 JSON:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.json());

app.post('/post', function (req, res) {
    if (req.body.data) {
        // 能正确解析 JSON 格式的 POST 参数
        res.send({
            status: 'success',
            name: req.body.data.name,
            url: req.body.data.url
        });
    } else {
        // 不能正确解析 JSON 格式的 POST 参数
        var body = '';
        req.on('data', function (chunk) {
            body += chunk; // 读取参数流转化为字符串
        });

        req.on('end', function () {
            try {
                var jsonStr = JSON.parse(body);
                res.send({
                    status: 'success',
                    name: jsonStr.data.name,
                    url: jsonStr.data.url
                });
            } catch (err) {
                res.send({ status: 'error' });
            }
        });
    }
});

app.listen(3000);

在这个例子中,我们首先尝试使用 req.body 来获取数据。如果数据为空或未定义,则读取请求的原始数据流,并将其转换为字符串,然后再解析为 JSON 格式。

通过这种方式,我们可以确保即使客户端未正确设置 Content-Type,我们的应用也能正确处理 JSON 格式的 POST 数据。


抢沙发,求围观!

你这么牛 你家孩子知道吗

学习了。

好东西 make

最烦这种挖坟的。。

最烦那种只回复 mark 的。。。

也可以在ajax发请求的时候设置ContentType:“application/json”

不错啊。值得收藏

。。。麻烦死了 以前我就直接POST转JSON。。现在又要转回去 又要兼容

在Node.js中使用Express框架解析JSON格式的POST数据,需要确保已经安装并配置了body-parser中间件。以下是详细的步骤和示例代码。

安装 body-parser

首先,你需要安装body-parser

npm install body-parser

配置和使用 body-parser

在Express应用中,你可以通过以下方式配置body-parser来解析JSON格式的数据:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

// 使用body-parser中间件解析JSON格式的POST数据
app.use(bodyParser.json());

app.post('/post', (req, res) => {
    // 获取JSON数据中的字段
    const name = req.body.data?.name;
    const url = req.body.data?.url;

    if (name && url) {
        // 成功解析JSON数据
        res.status(200).send({
            status: 'success',
            name: name,
            url: url
        });
    } else {
        // 未能正确解析JSON数据
        res.status(400).send({
            status: 'error',
            message: 'Invalid request data'
        });
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端发送POST请求

客户端在发送POST请求时,需要设置Content-Typeapplication/json,例如使用curl命令:

curl -X POST http://localhost:3000/post \
-H "Content-Type: application/json" \
-d '{"data":{"name":"一介布衣","url":"http://yijiebuyi.com"}}'

处理未设置Content-Type的情况

如果不确定所有客户端都会正确设置Content-Type,可以采用双重检查的方式来处理:

app.post('/post', (req, res) => {
    let body = '';

    req.on('data', chunk => {
        body += chunk;
    });

    req.on('end', () => {
        try {
            const data = JSON.parse(body);
            const name = data.data?.name;
            const url = data.data?.url;

            if (name && url) {
                res.status(200).send({
                    status: 'success',
                    name: name,
                    url: url
                });
            } else {
                res.status(400).send({
                    status: 'error',
                    message: 'Invalid request data'
                });
            }
        } catch (err) {
            res.status(400).send({
                status: 'error',
                message: 'Invalid JSON format'
            });
        }
    });
});

通过以上配置和代码,你可以有效地解析JSON格式的POST数据,并且能够处理未设置Content-Type的情况。

回到顶部