【发布时间】:2015-02-05 13:11:51
【问题描述】:
我正在制作一个必须使用 AJAX 验证表单的应用程序。没什么太花哨的。当触发表单提交时,我将发布到 Node.js 服务器上的 URL 并使用 Express 进行路由。如果数据未通过所有验证要求,我将发送状态码 400,如下所示:
app.post('/create', checkAuth, function (req,res)
{
var errors = new Errors();
if (req.body['game-name'].length < 3 || req.body['game-name'].length > 15)
{
res.send({
msg: 'Game name must be between 3 and 15 characters.'
}).status(500).end();
}
else
{
GameModel.find({id: req.body.roomname}, function (err,result)
{
if (result.length !== 0)
{
errors.add('A game with that name already exists.');
}
//Some more validation
if (errors.get().length > 0)
{
res.status(400).send({
msg: errors.get()[0]
}).end();
return;
}
else
{
var data = new GameModel({
roomname: req.body['roomname'],
owner: req.session.user,
id: req.body['roomname'].toLowerCase(),
config: {
rounds: req.body['rounds'],
timeLimit: req.body['time-limit'],
password: req.body['password'],
maxplayers: req.body['players'],
words: words
},
finished: false,
members:
[
req.session.user
]
});
data.save(function (err, game)
{
if (err) {
console.log(err);
res.send({
msg: 'Something funky happened with our servers.'
}).status(500).end();
}
else
{
res.send({
msg: 'All good!'
}).status(200).end();
}
});
}
});
}
});
在客户端,我有以下代码:
$.ajax({
type: "POST",
url: "/someURL",
data: $("form").serialize(),
statusCode:
{
200: function (data)
{
//All good.
},
400: function (data)
{
//Uh oh, an error.
}
}
});
奇怪的是,每当我发送 400 错误时,jQuery 都会调用 200 函数。我相信这是因为我正在发送一个对象以及状态码。我该如何解决这个问题?
【问题讨论】:
-
您能否在打开浏览器开发人员工具“网络”选项卡的情况下运行此程序,并包含此特定 HTTP 请求的屏幕截图,显示完整的响应标头和正文?由于快速路由问题,我怀疑响应与您预期的不同。
-
哦,还要显示完整的服务器sn-p。您在
if块中缺少return;语句。我敢打赌你的代码正在失败并改变状态和正文,因为错误代码和成功代码都在运行。 -
服务器代码相当广泛,但我会更新并缩写它。 Chrome 网络选项卡确实显示了 200,所以我想这不是 jQuery 的问题。
-
是的,在您的快速代码中添加一些
console.log以 100% 确定您认为响应的代码实际上是响应的,以及响应正文的样子。几乎可以肯定是路由问题或控制流错误。 -
我知道 400 行正在运行,因为它是唯一发送带有错误消息的响应的行,并且基于客户端日志记录,我收到了消息,而不是状态代码。
标签: javascript jquery ajax post express