即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空

Posted

技术标签:

【中文标题】即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空【英文标题】:req.body still empty in POSTs even with body-parser in node.js app (with CORS and HTTPS) 【发布时间】:2015-03-22 00:06:02 【问题描述】:

我正在尝试使用 express 制作一个非常基本的 node.js 应用程序,它通过 CORS 和 HTTPS 从 log4javascript 获取浏览器事件日志,并将它们写入 mongoDB。我一直试图让 bodyParser 显示数据。各种bodyParser的配置我都试过了,但是req.body、req.params和req.query都是空的。

这是我的代码。

var fs = require('fs'),
  bodyParser = require('body-parser'),
  express = require('express'),
  cors = require('cors'),
  app = express(),
  https = require('https'),
  key = fs.readFileSync('*****/key.pem'),
  cert = fs.readFileSync('*****/cert.pem'),
  https_options = 
    key: key,
    cert: cert
  ;

app.use(bodyParser.json());
app.use(cors());
app.post('/', function (req, res) 
   console.log(req);
   res.send('Hello World!')
);

https.createServer(https_options, app).listen(3443);

我在 log4javascript 中使用 JSON 布局。这是我的前端代码:

    var logger = log4javascript.getDefaultLogger(),                           
                 userAgent = navigator.userAgent.toLowerCase(),                        
                 ajaxAppender = new log4javascript.AjaxAppender("https://***/log/");
                 ajaxAppender.addHeader("Content-Type", "application/json");           
                 jsonLayout = new log4javascript.JsonLayout(false, false);             
                 ajaxAppender.setLayout(jsonLayout);                                   
                 ajaxAppender.setBatchSize(10);                                        
                 ajaxAppender.setThreshold(log4javascript.Level.INFO);                 
                 logger.addAppender(ajaxAppender);                          

这里是 log4javascript 根据 Chrome 发送的示例:

请求负载 ["logger":"[default]","timestamp":1421974733969,"level":"INFO","url":"https://*****/","message":[" \"message\":\"用户点击隐藏表单\",\"form\":\"audio\",\"userAgent\":\"mozilla/5.0 (macintosh; intel mac os x 10_10_1) applewebkit /537.36 (khtml, like gecko) chrome/39.0.2171.95 safari/537.36\",\"browserTimestamp\":\"Fri, 23 Jan 2015 00:58:53 GMT\",\"browserUnixTime\":1421974733968,lds_display_name =barnaby_b%40testing.****.com\""],"logger":"[default]","timestamp":1421974734498,"level":"INFO","url":"https: //*******.com/","message":["\"message\":\"用户点击展开表单\",\"form\":\"audio\", \"userAgent\":\"mozilla/5.0 (macintosh; intel mac os x 10_10_1) applewebkit/537.36 (khtml, like gecko) chrome/39.0.2171.95 safari/537.36\",\"browserTimestamp\":\"Fri, 2015 年 1 月 23 日 00:58:54 GMT\",\"browserUnixTime\":1421974734497,lds_display_name=barnaby_b%40testing.*****.com\""], .... 等

我做错了什么? CORS、HTTPS、APACHE mod_proxy 或其他任何东西会干扰 Express 解析正文的能力吗? Log4Javascript 是否以某种奇怪的方式发送 POST,我需要将其配置为可读的正文?请帮忙!

【问题讨论】:

console.log(req.headers['content-type']) 显示什么?你能显示你使用客户端提交请求的代码吗? 我不是节点专家,但我可以建议一些检查事项: 1. 在解析发生之前,请求是否有正文? mod_proxy 是否发送了它应该发送的所有数据? 2. 如果这是使用 CORS,您可以期待对同一 URL 的 GET 或 HEAD 预检请求,该 URL 不会有任何正文。 【参考方案1】:

这取决于您如何设置AjaxAppender。它可以配置为发送日志消息,就像发布一堆表单字段(听起来好像您所期望的那样)或仅发送未编码的有效负载(这似乎正在发生)。请参阅手册中的注释:

http://log4javascript.org/docs/manual.html#ajaxappender

【讨论】:

你的意思是布局的选择吗?我已将其从默认更改为 JsonLayout。我已经更新了我的问题以显示代码。我尝试删除该布局,并将批量大小设置为 1,但仍然是同样的问题。当我在 node.js 中检查它们时,body、params、query 都只是 ajaxAppender.addHeader("Content-Type", "application/json"); 将附加程序切换为将其有效负载作为原始 JSON 而不是 URL 编码的表单数据发送。放下那条线,我认为它会按你的意愿工作。

以上是关于即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空的主要内容,如果未能解决你的问题,请参考以下文章

Req.body 在 node.js 中不可迭代

无法在 Node.js res.body 中获取 $http.post 请求数据

Node.js:req.params 与 req.body

Node.js 承诺会间歇性地失败,即使在处理时也是如此

在 Node.js 中使用 async/await 正确处理错误

即使没有其他进程阻塞该端口,Node.js 应用程序也无法在端口 80 上运行