我使用 Express 创建了一个 Node.js 服务器,配置非常简单:
var express = require('express');
var app = express();
app.configure(function() {
app.use(express.urlencoded());
app.use(express.json());
app.use(express.cookieParser());
});
app.post('/login', function(req, res) {
res.json({foo: 'bar'});
});
app.listen(3000);
经检查,以下是 Firefox 记录的有关 /login
路由网络请求的数据:
Request URL: http://localhost:3000/login
Request Method: POST
Status Code: HTTP/1.1 200 OK
这是请求 header :
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
Pragma: no-cache
Origin: null
Host: localhost:3000
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 36
Connection: keep-alive
Cache-Control: no-cache
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Accept: application/json, text/javascript, */*; q=0.01
据我所知,到目前为止一切似乎都很好。然而,在我的 jQuery 代码中,fail() 回调始终被调用:
$.ajax({
type: 'POST',
url: 'http://localhost:3000/login',
data: {foo: 'bar'},
dataType: 'json'
})
.done(function() {
console.log('done');
})
.fail(function() {
console.log('fail');
});
这就是我的响应 header 的样子:
X-Powered-By: Express
Transfer-Encoding: chunked
Date: Fri, 17 Jan 2014 07:12:01 GMT
Connection: keep-alive
如何配置 Express 或 jQuery 设置以正确处理 JSON 响应?
最佳答案
试试这个:
$.ajax({
type: 'POST',
url: 'http://localhost:3000/login', ///<------do this
data: {foo: 'bar'},
dataType: 'jsonp', //<---for cross domain json data access
contentType:"application/json; charset=utf-8" //<----add this
})
.done(function() {
console.log('done');
})
.fail(function() {
console.log('fail');
});
检查您的服务器是否设置了正确的 header Access-Control-Allow-Origin:
header("Access-Control-Allow-Origin: http://yourdomain-you-are-connecting-from.com/");
更新:
对于跨域json数据访问可以使用jsonp
dataType来完成。
来自文档:
JSONP
如果 URL 包含字符串“callback=?” (或类似的,由服务器端 API 定义),请求将被视为 JSONP。有关更多详细信息,请参阅 $.ajax() 中对 jsonp 数据类型的讨论。
关于jQuery POST 总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180039/