JQuery ajax在POST上失败到express.js服务器

时间:2012-01-17 22:33:30

标签: jquery ajax node.js express

主要问题似乎是 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。

提前致谢!

2 个答案:

答案 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>

大多数浏览器的默认按钮类型是“提交”。但这并不能保证,所以指定一个类型总是一个好主意。