Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax POST请求为Sequelize触发两次。在Node.js/Express中创建_Javascript_Node.js_Ajax_Express_Sequelize.js - Fatal编程技术网

Javascript Ajax POST请求为Sequelize触发两次。在Node.js/Express中创建

Javascript Ajax POST请求为Sequelize触发两次。在Node.js/Express中创建,javascript,node.js,ajax,express,sequelize.js,Javascript,Node.js,Ajax,Express,Sequelize.js,否,e.stopPropagation()和e.preventDefault()不起作用。是的,我100%肯定我没有点击“提交”按钮两次。不,我不打算使用解除绑定,因为现在是2019年 现在我们已经解决了这个问题: 我有一个非常简单的登录/注册表,当点击提交按钮时,它会运行两次api POST路由。以下是表单的前端代码: $(document).ready(function(){ let timesTriggered = 0; $("#signup").on("click",

否,
e.stopPropagation()
e.preventDefault()
不起作用。是的,我100%肯定我没有点击“提交”按钮两次。不,我不打算使用解除绑定,因为现在是2019年

现在我们已经解决了这个问题:

我有一个非常简单的登录/注册表,当点击提交按钮时,它会运行两次api POST路由。以下是表单的前端代码:

$(document).ready(function(){
    let timesTriggered = 0;

    $("#signup").on("click", function() {
        timesTriggered++;

        event.preventDefault();
        event.stopPropagation();

        console.log(timesTriggered); 

        let newUser = {
            username: $("#username").val(),
            password: $("#password").val()
        };

        $.post("/api/signup", newUser);
    });

});
以下是表格本身:

<div id = "user-password-field">
        <input id = "username" name = "username" type="text" placeholder = "Username">
        <input id = "password" name = "password" type="password" placeholder = "Password">
        <button id = "login">Login</button>
        <button id="signup">Sign Up</button>
    </div>
非常简单的东西。然而,我所做的一切(除了用一个迭代变量和一个if语句(一种短期解决方案)破解api路由之外)都不会使路由只运行一次

请记住,我正在重新访问一个我并不特别熟悉的领域:Sequelize。有可能是某些sequelize问题导致命令运行两次而不是一次(尽管,正如我前面提到的,向api路由添加hack确实限制了插入的用户数)

为了安全起见,以下是模式文件夹:

  • INDEX.JS
  • USERS.JS
下面是
config.json

{
    "development": {
      "username": "root",
      "password": none of your business,
      "database": "yar",
      "host": "127.0.0.1",
      "port": 3306,
      "dialect": "mysql"
    },
    "test": {
      "username": "root",
      "password": none of your business,
      "database": "yar",
      "host": "127.0.0.1",
      "dialect": "mysql"
    },
    "production": {
      "username": "root",
      "password": null,
      "database": "database_production",
      "host": "127.0.0.1",
      "dialect": "mysql"
    }
  }
还有,我的
server.js

const express = require("express");
const session = require("express-session");
const PORT = process.env.PORT || 3000;
const app = express();

let db = require("./models");

app.use(express.static("public"));

app.use(express.urlencoded({extended:true}));
app.use(express.json());

const exphbs = require("express-handlebars");
app.engine("handlebars", exphbs({defaultLayout: "main"}));
app.set("view engine", "handlebars");


// Routes
require("./routes/apiRoutes")(app);
require("./routes/htmlRoutes")(app);

db.sequelize.sync().then(function() {
    app.listen(PORT, () => {
        console.log("Listening in on " + PORT);
    });
});
当我查看Google Chrome的inspect工具中的network选项卡时,它说api路由“/注册”运行了两次。因此,虽然我可以想象,对Sequelize缺乏全面了解可能会危及我,但我相当肯定,这几乎与Sequelize完全无关,更多的是路由、服务器和/或ajax调用的问题

如果你有任何答案,请告诉我。我在谷歌上钻研了一个小时,发现要么是老掉牙的回答,要么就是根本不起作用。祝你好运

U p D A T E

[网络标签截图][1]

这是一个经常发生的问题,有趣的是:ajax调用客观地起作用(“注册”api路由将正确的信息直接发送到数据库),然而,在成功的post请求几秒钟或几分钟后,Chrome的控制台将弹出:

POSThttp://localhost:3000/api/signup net::ERR\u EMPTY\u响应

这个问题已经解决了,仍然可以看到重复的ajax调用

下面是另一个屏幕截图,在“网络”选项卡中显示了更多信息: [更详细的网络信息][2]

U p D A T E 2


我发现名为
VM1421
的东西与我的
logic.js
文件一起运行。在谷歌上搜索(或任何类似搜索)时,都不会显示任何结果。此外,“网络”选项卡在两个api调用之间确实有一个重要区别:其中一个由
logicjs
发起,另一个由
VM1421 logic.js
发起。每个“文件”中的代码都是完全一致的

我在这篇文章的第一句话中提到,我已经使用了
e.preventDefault()
e.stopImmediatePropagation()
e.stopPropagation()

刚才,我回到了代码中,重新介绍了
e.stopImmediatePropagation()
,它现在可以工作了。因为编程


唯一的区别是我现在在onclick函数参数中指定了
event
。如果您遇到了相同的问题,并且已将所有三个
事件
示例放在一起,那么请尝试删除
e.stopPropagation()
,并保留其他两个。

上载网络选项卡用于api调用的屏幕截图。我已上载了屏幕截图。大约七秒钟后,连接将标记为“暂停”,并且
空响应将运行
错误(如上所述)。您没有在路由功能中发送任何响应(或者您提供的代码不完整)。另外,您看到的第一个请求可能是
OPTIONS
requestAgreed,我应该预料到这一点。愚蠢的错误。立即修复了
空响应
问题,但我仍在经历双重触发的Ajax路线。编辑:我在“网络”选项卡的任何位置都看不到选项。我将在主要帖子中提供更多信息。我已经安装了一个最小的应用程序,无法重现您的问题。很可能您正在注册两次
单击
事件
module.exports = function(sequelize, DataTypes) {
    let User = sequelize.define("User", {
        username: DataTypes.STRING,
        password: DataTypes.STRING
    });
    return User;
};
{
    "development": {
      "username": "root",
      "password": none of your business,
      "database": "yar",
      "host": "127.0.0.1",
      "port": 3306,
      "dialect": "mysql"
    },
    "test": {
      "username": "root",
      "password": none of your business,
      "database": "yar",
      "host": "127.0.0.1",
      "dialect": "mysql"
    },
    "production": {
      "username": "root",
      "password": null,
      "database": "database_production",
      "host": "127.0.0.1",
      "dialect": "mysql"
    }
  }
const express = require("express");
const session = require("express-session");
const PORT = process.env.PORT || 3000;
const app = express();

let db = require("./models");

app.use(express.static("public"));

app.use(express.urlencoded({extended:true}));
app.use(express.json());

const exphbs = require("express-handlebars");
app.engine("handlebars", exphbs({defaultLayout: "main"}));
app.set("view engine", "handlebars");


// Routes
require("./routes/apiRoutes")(app);
require("./routes/htmlRoutes")(app);

db.sequelize.sync().then(function() {
    app.listen(PORT, () => {
        console.log("Listening in on " + PORT);
    });
});