如何检索使用 CURL 传递的 NodeJS 中的 POST 数据?

Posted

技术标签:

【中文标题】如何检索使用 CURL 传递的 NodeJS 中的 POST 数据?【英文标题】:How to retrieve POST data in NodeJS that was passed using CURL? 【发布时间】:2017-12-26 20:09:31 【问题描述】:

我正在尝试使用 CURL 命令将一些参数传递给我的本地主机(使用 nodejs),但我的本地主机没有正确读取它们。

我正在向我的本地主机发出 POST 请求,如下所示:

curl --data "db_name=auto&old_db=Lab.tar.gz&new_db=627999E00_10.tgz" 
     --noproxy localhost 
     -H "Accept: text/plain" 
     -H "Content-Type: text/plain" 
     -X POST http://localhost:8084/auto

我尝试使用这样的节点检索我的数据参数:

app.post('/auto',function(req,res)
    var db_name=req.body.db_name; //undefined
    var old_db=req.body.old_db; //undefined
    var new_db=req.body.new_db; //undefined
    ...
);

但是db_name,old_db,new_db 总是undefined

另外,req.body 是一个空对象

req.url 就是/auto

如何在 node 中检索我通过 curl 程序传递的参数?

================== 版本

NodeJS v6.5.0 ExpressJS v3.14.0 CURL v7.22.0

================== 更新

我的 ExpressJs 配置如下:

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.urlencoded());
app.use(app.router);
app.use(express.static(_path.join(__dirname, '..', 'Client')));

我还尝试了一些其他卷曲变化:

curl --noproxy localhost 
     -H "Accept: text/plain" 
     -H "Content-Type: application/json" 
     -X POST 
     -d "'db_name':'auto','old_db':'Lab.tar.gz','new_db':'627999E00_10.tgz'" 
     http://localhost:8084/auto

【问题讨论】:

app.use(express.bodyParser());放在开头有什么作用吗? @J.Chen 我已经知道了:/ 我会将该信息添加到问题中 app.use(express.urlencoded()); 呢? 我不知道如何读取节点中的数据,但数据在 POST 正文中,以 application/x-www-urlencoded 格式编码。如果您找到请求正文,请参阅此处以解析它***.com/a/8486188/1067003 @J.Chen 我现在开始工作了!你是对的,对象方法有帮助!我把CURL命令中的两个-H选项去掉,改成JSON形式,然后在服务端解析JSON!现在可以使用了,非常感谢^-^ 【参考方案1】:

尝试添加 json body parser 中间件

const bodyParser = require('body-parser');
app.use(bodyParser.json());

【讨论】:

顺便说一句,我认为 express.bodyParser 已被弃用 对不起,我已经把这行加进去了。原来是我的 CURL 命令出了问题!不过谢谢!【参考方案2】:

在@J.Chen 和@hanshenrik 的帮助下终于让它工作了!

如果我将 CURL 请求中 --data 的格式更改为 JSON 对象(如 'key':'value',...)而不是字符串 (key=value&...),

如果我从 CURL 请求中删除 -H "Accept: text/plain" -H "Content-Type: application/json"

然后我的nodeJS Application终于看到req.body中的参数了。

所以我的最终代码是:

curl --noproxy localhost 
     -X POST 
     -d "'db_name':'auto','old_db':'Lab.tar.gz','new_db':'627999E00_10.tgz'" 
     http://localhost:8084/auto

而我的 NodeJS 代码是:

app.post('/auto',function(req,res)
    var parseMe = Object.keys(req.body)[0];
    var parsedParams = JSON.parse(parseMe);

    var db_name=parsedParams.db_name; 
    var old_db=parsedParams.old_db; 
    var new_db=parsedParams.new_db; 
    ...
);

【讨论】:

这已经很老了,但希望它有所帮助:我不得不更改引号:这没有:data="'content':'2022'",但这样做了:data='"content":"2022"'

以上是关于如何检索使用 CURL 传递的 NodeJS 中的 POST 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用express [重复]在nodejs中将对象从服务器端传递到客户端

递归获取目录NodejS中的所有文件

如何使用nodejs在IBM Db2的LIKE查询中传递参数?

使用 NodeJS,如何使用 Spring Security OAuth2 制作的 JWT 检索存储在 PostgreSQL 中的会话信息?

如何使用 nodejs 使用 Dynamodb 并行扫描检索数据

在NodeJS服务器上处理大量数据检索