Node.js req.body为空

时间:2016-03-11 19:33:25

标签: javascript ajax node.js express

我和这个人度过了一段难忘的时光。我不知道为什么我的node.js响应是空的。如果我通过这里的javascript发送它,或者如果我使用Advanced REST客户端,它会返回{}。这是我的代码:

client.js

unction ajaxPost(){

var req = new XMLHttpRequest();
var payload = {'Add Item':'Add Item',
                'name':document.getElementById('submitForm').elements[0].value,
                'reps':document.getElementById('submitForm').elements[1].value,
                'weight':document.getElementById('submitForm').elements[2].value,
                'date':document.getElementById('submitForm').elements[3].value,
                'lbs':document.getElementById('submitForm').elements[4].value
           }
payload['test'] = 'value!';
console.log('did this happen?');
console.log(payload['test']);
var url = '/edit';
req.open('POST', url, true);
req.setRequestHeader('Content-Type', 'application/json');
req.addEventListener('load',function(){
  if(req.status >= 200 && req.status < 400){
    var response = JSON.parse(req.responseText);
    console.log('you got a response!')

  } else {
    console.log("Error in network request: " + req.statusText);
  }});
console.log(JSON.stringify(payload));
req.send(JSON.stringify(payload));

event.preventDefault();

}

HTML

<form id = "submitForm">
    <input type="text" name="name" id="name" value='test'>Name<br>
    <input type="text" name="reps" id="reps" value='10'>Reps<br>
    <input type="text" name="weight" id="weight" value='100'>Weight<br>
    <input type="text" name="date" id="date" value='1/1/16'>Date<br>
    <input type="text" name="lbs" id="lbs" value='1'>Pounds<br>
    <input type="submit" onclick = 'ajaxPost()' value="Add Item">
</form>

服务器

var express = require('express');
var mysql = require('./dbcon.js');
var bodyParser = require('body-parser');

var app = express();
var handlebars = require('express-handlebars').create({defaultLayout:'main2'});

app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');
app.set('port', 3010);

app.post('/edit',function(req,res,next){
  //var context = {};
  console.log('you posted!');
  console.log(req.body);

在我的控制台中,我看到req.body是{}。

我不知道我做错了什么。我试过使用httpbin,我可以看到javascript工作正常,这意味着我可能在节点方面做错了,但我无法弄清楚是什么。如果我在表单上使用method =“submit”,那么帖子就会很好,但这不是我想做的。我究竟做错了什么??因为高级REST客户端也失败了,我猜它是节点?

2 个答案:

答案 0 :(得分:2)

您正在请求中发送json,但您只有中间件设置来处理url编码的请求。将此添加到您的中间件,json请求应填充在req.body中。

urlencoded

可以在正文解析器documentation中找到更多信息。具体来说,您会注意到middleware you are using System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3; 表示它只解析urlencoded主体(这是使用Content-Type的地方)。

答案 1 :(得分:0)

您将标题设置为json

req.setRequestHeader('Content-Type', 'application/json');

并且未使用bodyParser.json()

尝试添加app.use(bodyParser.json());

相关问题