【问题标题】:success is fired before end response在结束响应之前触发成功
【发布时间】:2017-10-28 13:48:10
【问题描述】:

作为 web 开发的初学者,我正在使用纯 node.js 构建我的第一个 web 应用程序。 在注册部分,表单数据将从客户端发布到服务器,然后添加到数据库中。成功后,客户端将根据收到的响应来操作 DOM。但是,成功回调总是在响应发送之前触发。

客户端代码:

$.post('/register.db', {
        data: JSON.stringify(user),
        contentType: "application/json",
        dataType: "text",
        success: function(data){
            alert(data);
            if(response == register.exists){
                $(".login-form>input:nth-child(3)").append("<span>This email has already been used</span>");
            }
            else if(response == register.success){
                $(".login-wrapper>span").html("Proceed to login");
                $(".register-wrapper").html("");
            }
        }
    });

服务器端代码:

                    var body = "";
                    req.on("error", function(){
                        handleError();
                    }).on("data", function(chunk){
                        body += chunk;
                    }).on("end", function(){

                        // success callback is fired as soon as request ends
                        // code afterwards is executed after success callback
                        // but response is written in db.register() function
                        var user = JSON.parse(qs.parse(body).data);
                        console.log("user ",user);
                        res.on('error', function(err){
                            handleError();
                        });
                        db.register(res, user);
                    });

---编辑:添加数据库代码---

数据库代码:

register:
        function(res, user){
            var account = user['email'];
            client.sismember('users', account, function(err, response){
                res.statusCode = 200;
                res.setHeader('Content-type', 'text/plain');
                // account already exists
                if(response != 0){
                    res.write(register.exists);
                    res.end();
                    return;
                }
                client.sadd("users", account);
                client.hmset(account, "pin", user.pin, "first_name", user.first_name, "last_name", user.last_name);
                res.write(register.success);
                res.end();
                return;
            });
        }

哪位好心人能指出我哪里出错了吗?我会很感激的!!

【问题讨论】:

  • 服务器代码中没有显示任何内容。建议大家多学习教程
  • 嗨 charlietfl,为了清楚起见,我只是注释掉了将数据发送到数据库的部分。问题就像我说的,只要请求结束就会触发成功回调,无论之后发生什么。
  • 如果成功触发,则表示请求已完成。如果成功的数据是空的……那是因为没有发送。
  • 我编辑了问题描述。在服务器端代码中,console.log("user ",user);在成功回调之后执行,这意味着在成功之前写入响应的db.register()甚至没有运行。

标签: javascript jquery node.js ajax post


【解决方案1】:

我把客户端代码改成下面的代码,它神奇地工作了……我只是用匿名回调函数替换了成功回调……有人知道这两种定义成功回调的方法之间的区别吗?

$.post('/register.db',
            {
                data: JSON.stringify(user),
                contentType: "application/json",
                dataType: "text"
            },
            function(data){
                alert(data);
                if(response == register.exists){
                    $(".login-form>input:nth-child(3)").append("<span>This email has already been used</span>");
                }
                else if(response == register.success){
                    $(".login-wrapper>span").html("Proceed to login");
                    $(".register-wrapper").html("");
                }
            });

【讨论】:

  • $.post() 的文档并未表明可以在 data 哈希中指定成功回调。我很惊讶地得知它在以这种方式指定时会触发,如果确实是这样的话。就个人而言,我总是写$.post(...).then(...)。
  • 事实上,问题中的$.post(...)表达式是$.ajax()和$.post()的完全混合体。这在几个方面是错误的。
  • @Roamer-1888 我明白了。是的,我完全混淆了 $.ajax() 和 $.post()。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多