无效的 JSON GET 请求 Express.js

Posted

技术标签:

【中文标题】无效的 JSON GET 请求 Express.js【英文标题】:Invalid JSON GET Request Express.js 【发布时间】:2013-05-28 14:12:38 【问题描述】:

在编写 API 时,我遇到了一个非常棘手的错误:当我尝试使用 Content-Type 标头 application/json(大多数 AJAX 的默认设置)执行 res.send(INSERT JSON) 时,我收到 invalid json 错误.当我将 content-type 设置为其他任何值时(例如text/plain),我得到了正确的响应,但是为了使用一些前端框架,我需要支持application/json。这是实际的错误消息:

Error: invalid json
    at Object.exports.error (/Users/Brad/node_modules/express/node_modules/connect/lib/utils.js:44:13)
    at IncomingMessage.module.exports (/Users/Brad/node_modules/express/node_modules/connect/lib/middleware/json.js:68:73)
    at IncomingMessage.EventEmitter.emit (events.js:85:17)
    at IncomingMessage._emitEnd (http.js:366:10)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23)
    at Socket.socket.ondata (http.js:1680:22)
    at TCP.onread (net.js:410:27)

我的服务器代码如下:

app.configure(function () 
  app.use(express.bodyParser());
  app.use(express.cookieParser('SALT'));
  app.use(express.static(__dirname + '/static/'));
  app.use(express.session());
);

app.get('/users', function(req, res) 
  res.send('test': 'test');
);

这是我的 Postman 设置的图片——我正在使用 Postman Chrome 扩展程序来测试我的 API:

【问题讨论】:

该代码看起来还不错,也可以正常工作。什么是生成“无效 json”错误? 当我使用content-type 作为application/json 发出 GET 请求时,我收到无效的 JSON 错误。我会将实际错误添加到我的问题中。 我认为这意味着您发送到服务器的数据不是有效的JSON。你如何测试这个(哪个客户端)? 我在 Chrome 上使用 Postman 扩展程序。我只是输入 url (localhost:3000/users),将其设置为发出 GET 请求,然后输入标题。 我安装了 Postman 并做了同样的事情,运行您发布的服务器代码,它工作得很好。 【参考方案1】:

我认为问题在于您想在服务器响应中使用 Content-Type 标头;不在您的请求 Content-Type 标头中。

当您在请求中使用 Content-Type 标头时,Express 将读取 Content-Type 并尝试将提供的信息解释为该 Content-Type,在本例中为 JSON。因为这是一个 GET 请求,因此没有正文,Express 试图将一个空字符串解释为 JSON,这会给您带来错误。

【讨论】:

是的,对于GET,服务器会期望Accepts 标头设置为相同的值(application/json)。 感谢Accept 的建议——这在 Postman 中非常有效。但是,我正在尝试将此 API 连接到 ember.js 的 RESTAdapter,当它向服务器发出 GET 请求时仍然会出现相同的错误。 Accepts 标头更多的是让服务器知道客户端期望什么的请求。不能保证服务器会真正返回这个。 很奇怪我无法用 Postman 重现问题,但很高兴看到它已解决 :) @robertklep 您可以通过设置 Content-Type: application/json 标头并向正在运行的任何 Express 服务器发出 GET 请求来重现 Postman 的问题。我相信必须使用 bodyParser 中间件。通过使用 Content-Type: application/json 和空正文发送 POST 请求也可以看到相同的问题;但可以通过发送“”正文轻松正确。

以上是关于无效的 JSON GET 请求 Express.js的主要内容,如果未能解决你的问题,请参考以下文章

AFN Post方法 设置请求头(json)

某些 GET 请求对预检的 Angular2 响应无效(重定向)

使用 AngularJS 发送 GET 请求时无法从 WebStorm IDE 执行“打开”无效 URL

获取无效 POST、PATCH 的 CORS 错误 - REST 端点

WCF GET URL 长度限制问题:错误请求 - 无效 URL

Ajax GET 请求后表单提交失败(无效的 CSRF 令牌)。怎么修?