如何使用快速路由器提取json?

时间:2017-01-08 11:51:12

标签: express xmlhttprequest

我使用post:

将JSON对象发送到我的服务器
 const xhr = new XMLHttpRequest();
 var params = {
     firstname: "Joe",
     lastname: "Bloggs"
 };
 xhr.open('post', '/api/endpoint');
 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
 xhr.responseType = 'json';
 xhr.addEventListener('load', () => {
     ...
 });
 xhr.send(JSON.stringify(params));

我使用快递来处理请求:

...
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
...

然后在我的api端点我正在使用Express Router:

const express = require('express');
const router = new express.Router();
router.post('/endpoint', (req, res) => {
    console.log(req.body);
});

当我打印出req.body时,我得到以下内容:

{ '{"firstname":"Joe","lastname":"Bloggs"}': '' }

如果我使用JSON.parse(req.body),我会收到以下错误:

  

TypeError:无法将对象转换为原始值       在JSON.parse()

如何以我可以使用的格式获取有效负载的内容,即json对象?

1 个答案:

答案 0 :(得分:0)

您表示您将在此处发送application/x-www-form-urlencoded

xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

在这里你发送JSON:

xhr.send(JSON.stringify(params));

这是一个明显的违规行为。确保在提出请求时遵守您向服务器指明的格式:

var payload = 'firstname=' + encodeURIComponent(params.firstname) + 
              '&lastname=' + encodeURIComponent(params.lastname);
xhr.send(payload);

另一方面,如果您想发送JSON内容,那么您可以在服务器上添加相应的正文解析器:

app.use(bodyParser.json({ type: 'application/json' }))

然后在客户端上设置正确的Content-Type请求标头:

xhr.setRequestHeader('Content-type', 'application/json');

现在您可以在发送请求时JSON.stringify

xhr.send(JSON.stringify(params));

在api端点,然后可以从req.body中提取JSON(无需使用JSON.parse