我有一个 Express 服务器,其中包含删除(心理学)实验的路线。 (我已将路线分成多个文件。该路线位于 admin.js 中,因此其完整路线路径为 /admin/experiments/:expId)
router.route('/experiments/:expId')
.delete(tokens.verifyToken, adminValidator.isAdmin, (req, res) => {
const experimentId = req.params.expId;
const db = req.db;
db.removeExperiment(experimentId);
renderExperiments(req, res, db);
})
function renderExperiments(req, res, db) {
let allExps = expStandard.getAllExperiments(db);
res.render('adminExperiments', {
allExps: allExps,
approved_flag: APPROVED_EXPERIMENT,
pending_flag: PENDING_EXPERIMENT
});
}
此路由从数据库中删除实验,然后调用呈现关联的 adminExperiments.ejs 视图的方法。这是一个仅创建 HTML 表的 EJS 模板。表的每一行对应一个实验。在每一行中我都包含了一个删除按钮。每个删除按钮都与单击该按钮时的事件监听器相关联:
这是在客户端执行的相关js脚本(adminExperiments.js)中的代码:
document.addEventListener('DOMContentLoaded', registerDeleteExpListeners);
function registerDeleteExpListeners() {
let deleteButtons = document.querySelectorAll('.btn_exp_delete');
for (b of deleteButtons) {
b.addEventListener("click", deleteExperiment);
}
}
async function deleteExperiment(event) {
// ???
}
问题: 我在事件监听器 deleteExperiment() 中使用什么来连接到我的 Express 路线?
我尝试使用带有“delete”方法标头的 Fetch 并将其发送到路由的 URL (/admin/experiments/:expId)。尽管我可以向路由发送删除请求并且该请求已被接收,但它不会呈现 adminExperiments.ejs。相反,会发送回状态为 200 的响应对象。这很好,但这不是我想要的。我想要一个带有更新的实验列表的新页面。
显然,这不能用 Fetch 来完成。 Fetch 的作用正如它所说:它获取数据。它不会重定向/呈现新页面。
为此,我在使用 fetch 发出删除请求后添加了这行代码:
window.location.replace('/admin/experiments');
换句话说,我必须手动将窗口指向不同的 URL。