node.js - 如何防止连续两次调用快速路线?
问题描述
我有一个按钮,可以调用在我的网站上发布信息的路线。
问题是当用户电话延迟时,他们在被重定向到主页之前按了两次按钮,然后创建了 2 或 3 个帖子。
我怎么能解决这个问题?
handleSubmit(event) {
event.preventDefault();
axios.post("/publishJob", this.state).then(resp => {
if (resp.data.success) {
this.setState({
jobData: ""
});
this.props.history.push("/");
}
});
}
app.post("/publishJob", (req, res) => {
return database
.publishJob(
req.user.id,
req.body.jobData.data.restname,
req.body.jobData.data.jobtype,
req.body.jobData.data.hourpay,
req.body.jobData.data.typepay,
req.body.jobData.data.schedule,
req.body.jobData.data.contact,
req.body.jobData.data.address,
req.body.jobData.data.area,
req.body.jobData.data.phone,
req.body.jobData.data.extrainfo,
req.body.jobData.data.urgent,
req.session.userId
)
.then(() => {
res.json({
success: true
});
});
});
解决方案
您可以实现一个 Throttle 函数。此函数只允许在特定时间范围内调用一次,例如,一个函数只能每 2 秒调用一次。
您可以在此处找到有关此的更多信息:https ://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
油门功能是这样的:
const throttle = (func, limit) => {
let inThrottle
return function() {
const args = arguments
const context = this
if (!inThrottle) {
func.apply(context, args)
inThrottle = true
setTimeout(() => inThrottle = false, limit)
}
}
}
你可以像这样使用它:
throttleBtn.addEventListener('click', throttle(function() {
return console.log('Hey! It is', new Date().toUTCString());
}, 1000));
推荐阅读
- matlab - 在 MATLAB 中求解方程
- javascript - 在特定坐标中显示图标(OpenLayers)
- ruby-on-rails - 如何为系统测试禁用 Rails 测试并行化 *just*?
- java - 向上和向下看什么?(对象类型或引用类型)
- docker - 如何将相同的本地文件夹结构复制到 docker 容器?
- r - 将 PCA 应用于 R 中具有 NA 值的数据
- ios - 快速停止五彩纸屑动画
- javascript - 单击按钮从外部 API 获取天气数据时出现问题
- python - 在 Seaborn 图中指定独立轴值
- javascript - 如何在javascript中组合日期时间字符串