2013-06-02 53 views
4

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

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'}); 
}); 

这里是我的邮差设置的画面 - 我使用的邮差的Chrome扩展程序来测试我的API: enter image description here

+1

该代码看起来很好,并且工作正常。什么是产生'无效的json'错误? – robertklep

+0

当我使用'content-type'作为'application/json'进行GET请求时,我得到无效的JSON错误。我会在我的问题上加上实际的错误。 –

+1

我认为这意味着您发送*到服务器*的数据不是有效的JSON。你如何测试这个(哪个客户端)? – robertklep

回答

4

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

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

+2

是的,对于'GET',服务器会期望一个'Accepts'头文件,它会被设置为相同的值('application/json')。 –

+0

感谢您的“接受”建议 - 这在邮递员中非常有效。但是,我试图将这个API连接到ember.js的RESTAdapter,它在向服务器发出GET请求时仍然给出相同的错误。 –

+0

接受标题更多的是让服务器知道客户端期望的请求。不能保证服务器实际上会返回这个。 –