Node.js的Express参数获取及获取POST请求的请求体

专栏收录该内容

Hi I'm Shendi



在之前介绍过 Express 的使用,但是没有介绍参数部分的获取,于是在这里记下



获取url参数

在 http 中,参数大致分为链接上的参数与请求体

获取 url 参数很简单,Express将所有url参数放到了请求的 query 对象中

例如链接为 sdpro.top?name=Shendi&age=20

代码如下

router.get('/', (req, res, next) => {
	let name = req.query.name;
	let age = req.query.age;
	console.log(`name=${name}, age=${age}`);
});

效果如下

效果




获取请求体数据

我是因为这部分才来写这篇文章的,因为在我看来,一个Web框架,获取参数的话应当是非常简单的,通过IDE提示大概就知道用什么参数

但是Express实际上没有提供获取请求体数据的方法,网上说的大体都是使用第三方包 body-parser


但是本着能减少依赖就减少依赖的想法,我在IDE通过代码提示查看req拥有的属性和函数,觉得可能的就进行尝试,然后找到个 read 函数

read函数


函数返回Buffer类型,经过尝试后成功获取到了请求体

console.log(req.read().toString());

下面示例是我在编写微信公众号后端,发送消息后推送的请求

请求体


下面是read函数的注释翻译

readable.read()方法从内部缓冲区中读取数据并返回。如果没有可用的数据可供读取,则返回null。默认情况下,除非使用可读的.setEncoding()方法指定了编码,或者流在对象模式下运行,否则数据将作为Buffer对象返回。

可选的size参数指定要读取的特定字节数。如果大小字节无法读取,则返回null _unless _流已结束,在这种情况下,将返回内部缓冲区中剩余的所有数据。

如果未指定size参数,则将返回内部缓冲区中包含的所有数据。

size参数必须小于或等于1 GiB。

readable.read()方法只能在以暂停模式运行的readable流上调用。在流动模式下,readable.read()会被自动调用,直到内部缓冲区完全耗尽。


这个方法是我自己摸索出来的,不知道可不可靠,在官方的API文档中也没有这个函数

官方api


但是根据函数注释,感觉还是没有问题的,也可以选择使用网上说的增加 body-parser 依赖的方式去获取请求体

但对我来说,效果已经实现了,目前看来还是没有任何问题的...


补充

今天在开发中尝试用 read 读取请求体,为 null,想到可能是请求体还未处理完成?加上 setTimeout(()=>{req.read()},0) 这样就没问题了。但总感觉这样不太好。

于是查阅文档(文档更新了),找到了 req.body 的说明:https://nodejs.cn/express/4x/api/req/#body

其中有说到,当使用 express.json()express.urlencoded() 时不为空,而 urlencoded 就是通常 post 请求的响应体参数类型,如下,这种方式也不用自己转换解析了,可以与 req.params 相似的方式使用。

app.use(express.urlencoded({ extended: true }));

app.post('/profile', function (req, res, next) {
    console.log(req.body);
    console.log(req.body.id);
});



END

本文链接:https://sdpro.top/blog/html/article/1095.html

♥ 赞助 ♥

尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?