【问题标题】:jQuery ignoring status code from ExpressjQuery忽略来自Express的状态代码
【发布时间】: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


【解决方案1】:

首先猜测是您需要在 if 块内的 express 代码中使用 return; 语句。我敢打赌错误代码正在运行,然后成功代码和状态代码/正文的最后一个值被发送到浏览器。

【讨论】:

  • 你是对的。正如您在更新的代码中看到的那样,在 mongoose 回调发送消息之后的状态之前处理的第一个错误,显然发送了 200。
猜你喜欢
  • 2021-03-05
  • 2017-05-26
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多