主要问题似乎是 jQuery在AJAX请求中发送以下标头:
POST http://localhost:3000/enter HTTP/1.1
,虽然它应该是
POST /enter HTTP/1.1
更详细地说,这就是我的服务器和客户端的设置方式以及确切的请求和响应:
我在服务器上使用express.js
并在客户端上使用jQuery
进行了非常简单的设置。我需要的只是对服务器的POST请求。
这或多或少是服务器的样子:
app.post('/enter', function(req, res){
console.log(req.body)
res.json({flag: true})
})
这是jQuery的样子:
$.ajax(
{ url: '/enter'
, type: 'POST'
, cache: false
, data:
{ field1: 1, field2: 2 }
, success: function(data){
alert('Success!')
}
, error: function(jqXHR, textStatus, err){
alert('text status '+textStatus+', err '+err)
}
})
当然,服务器的console.log
确认了正确的数据。我在AJAX之后收到的警告信息只是text status error err
。
Chrome告诉我请求标题是:
POST http://localhost:3000/enter HTTP/1.1
Origin: http://localhost:3000
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://localhost:3000/?
对该请求的回复是:
HTTP/1.1 0 undefined
我还使用telnet来清楚了解情况。在telnet中,我看到响应是:
404 Not Found
X-Powered-By: Express
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
28
Cannot POST /http://localhost:3000/enter
0
所以问题似乎是POST http://localhost:3000/enter HTTP/1.1
行。如果我将该行的标题发送更改为POST /enter HTTP/1.1
,则效果非常好!
我在Ubuntu 11上使用Chrome 15.我也尝试过使用Firefox 9。
提前致谢!
答案 0 :(得分:3)
这似乎与提交表单的方式有关,奇怪的是。
我误解了<button>
标签的语义,并尝试在我的表单中使用它:
<form>
<button id="enter">Enter</button>
</form>
我创建了这样的事件处理程序:
$('#enter').click(function(){ /* AJAX stuff... */ })
当我将HTML更改为
时<form>
<input type="button" id="enter" value="Enter">
</form>
,它运作正常。
然而,我并不完全清楚它为什么会造成错误。它似乎与按钮提交表单的事实有关。如果有人能向我解释这一点,我会很感激。
无论哪种方式,谢谢你的回复!
答案 1 :(得分:0)
您需要在button元素中定义type属性,使其行为类似于按钮输入类型,如下所示:
<button id="enter" type="button">Enter</button>
大多数浏览器的默认按钮类型是“提交”。但这并不能保证,所以指定一个类型总是一个好主意。