即使在 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 中仍然为空的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Node.js res.body 中获取 $http.post 请求数据