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);
});
});