【问题标题】:jQuery POST always failingjQuery POST 总是失败
【发布时间】:2014-01-17 15:44:18
【问题描述】:

我使用 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

这里是请求标头:

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

这是我的响应标头的样子:

X-Powered-By:   Express
Transfer-Encoding:  chunked
Date:   Fri, 17 Jan 2014 07:12:01 GMT
Connection: keep-alive

如何配置我的 Express 或 jQuery 设置以正确处理 JSON 响应?

【问题讨论】:

  • 尝试修改您的 jQuery AJAX 调用,如 this 并检查您遇到的错误。
  • @srvikram13 进行了更改,结果相同

标签: jquery json node.js express http-headers


【解决方案1】:

试试这个:

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

检查您的服务器是否设置了正确的标头Access-Control-Allow-Origin

header("Access-Control-Allow-Origin: http://yourdomain-you-are-connecting-from.com/");

更新:

对于跨域json数据访问可以使用jsonpdataType。

来自文档:

JSONP

如果 URL 包含字符串“callback=?” (或类似的,由服务器端 API 定义),请求被视为 JSONP。有关详细信息,请参阅 $.ajax() 中对 jsonp 数据类型的讨论。

【讨论】:

  • 请求是跨域的,所以我一直使用完整地址。我确实添加了 contentType,但它仍然不起作用。
  • 那么你必须使用jsonp 而不是json
  • 好吧,这是有道理的,但不幸的是它仍然失败
  • 嗯...那么如果您可以验证您的服务器已设置为发送数据以进行跨域访问。如果您点击 url,它会在浏览器中显示什么?
  • 感谢您的帮助,我不会想到 Access-Control-Allow-Origin 位。这是帮助我让它工作的原因:enable-cors.org/server_expressjs.html
猜你喜欢
  • 2013-11-29
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
相关资源
最近更新 更多