【问题标题】:Node js empty request body with CORS and JSON带有 CORS 和 JSON 的节点 js 空请求正文
【发布时间】:2016-04-04 12:49:51
【问题描述】:

我发布这个主题是关于标题所暗示的问题。我见过其他几个关于空请求正文的问题,但没有一个对我有帮助。希望如果我发布自己的代码,有人能够给我一个很好的提示。

基本上,我有一个客户端使用 javascript 向 Node.js 服务器发出 CORS HTTPRequest。通常这些 HTTPRequest 是 JSON 对象的帖子。

这里是客户端的示例代码。

username = document.getElementById("username").value;
password = document.getElementById("password").value;
var str = '{"name":"'+username+'","pass":"'+password+'"}';
var req = new XMLHttpRequest();
req.open("POST","http://xxxx:8099/register",true)
req.setRequestHeader("Content-type", "application/json");
req.onreadystatechange = function() 
{
     //irrelevant
}
req.send(str);

}

这是服务器的代码。

var express    = require('express');
var bodyParser = require('body-parser');
var app = express();
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
extended: true
}));

// parse application/json
app.use(bodyParser.json());
app.listen(8099);
app.post("/register", function (req, res) {
console.log(req.body); // populated!
console.log(req.body.name);
res.send(200, req.body);
});

现在这些是我得到的结果:

如果我将请求 Content-type 设置为 application/json,那么在服务器上我会得到一个空的请求正文。

如果我将请求 Content-type 设置为 application/x-www-form-urlencoded,那么我会得到一个填充的主体,例如 { '{"name":"usernamtest","pass":"123"} ': '' }.

但是,如果我尝试打印 req.body.name,我会得到 undefined,这意味着 body-parser 没有正确地将 body 解析为 JSON。

我将如何解决这个问题?我只想在示例中得到这些属性的 JSON 对象。

对于阅读本文的人,我感谢您的宝贵时间。 补充, 里卡多·费雷拉·达席尔瓦

【问题讨论】:

  • 您确定代码有效吗?自己尝试过,我得到了预期的结果(名称打印到控制台)。您是否正确地从输入中获取数据?您可以尝试清理您的 XHR 代码:jsbin.com/revovemepu/edit?js
  • 是的,我敢肯定,事实上,客户端可以完美地与我的教授已经制作的测试服务器一起工作,但它不能与我一起工作。如果我按原样运行代码,当我打印 req.body 时,我得到 {},这是一个空正文。
  • xxxx:8099/register 中的 xxxx 是什么?您实际上是在发出跨域请求吗?您为嵌入客户端 JS 的 HTML 页面提供服务的域与您制作 XHR 的域是否不同?
  • 完整地址是twserver.alunos.dcc.fc.up.pt:8099/register,它是一个 Apache 服务器,因此我可以托管我的 node.js 服务器。这可能很重要,我发现当我尝试在请求中发送字符串化 JSON 时,我收到以下错误:XMLHttpRequest cannot load twserver.alunos.dcc.fc.up.pt:8099/register。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'null'。
  • 而 index.html 文件是从哪里提供的?

标签: javascript json node.js cors body-parser


【解决方案1】:

现代网络浏览器添加了一项新的安全要求,有助于阻止从另一个域对您的网络服务进行未经授权的访问。 CSRF(或跨站点请求伪造)黑客攻击涉及从另一个域向 Web 服务发出 HTTP 请求,以试图破坏服务器安全并获得对存储在服务器上的潜在有价值数据的访问权限。如果浏览器发现该请求与发出请求的网站所在的域相同,则它允许发出请求。但是,如果域不同并且请求涉及获取静态文件以外的其他内容,则浏览器首先检查从服务器访问服务的权限。

CORS 标头(或跨域资源共享)是服务器应响应以通知浏览器允许的内容。 CORS 可以将域、http 方法和特定标头列入白名单。

此过程称为 CORS 预检。

使用以下标头:

访问控制允许来源:*

基本上使所有域都可以访问。 Web 服务是完全公开的。除非您打算公开您的服务,否则这可能会留下一个巨大的安全漏洞。

Access-Control-Request-Method 指示允许哪些 HTTP 方法。如果允许,通常默认允许 GET 请求。

Access-Control-Request-Age 决定了 CORS Preflight 的有效时间。以秒为单位。

Access-Control-Allow-Headers 表示服务器接受的任何标头。

我强烈建议您了解 AJAX 黑客攻击以及防止它的方法(如果您还没有的话)。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 2017-08-08
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多