我正在开发一个React/Express应用程序。有一个删除按钮,但它只返回错误:
xhr.js:251错误http://localhost:3333/entries/2 404(未找到)
和
EntryDetails.js:39删除条目时出错:AxiosError {message:“请求失败,状态代码为404”,名称:“AxiosError”,代码:'ERR_BAD_REQUEST',配置:{...},请求:XMLHttpRequest,...}
我去 Postman ,并试图删除,它也不会工作。我阴阳怪气:
Cannot DELETE /entries/2
这是真实的几个不同的入口号码,我尝试。奇怪的是,我可以很好地发送GET请求。
我已经检查了路由配置和拼写,并将其放入console.log。数据库已配置好并可访问。我已经检查了名为entries的表是否存在。(我使用的是postgres)它是一个简单的表,不连接到任何其他表,所以不应该有任何相关的约束。
我最初在删除路由中有一个错误,它有条目而不是条目,但我改变了它,并从那时起重新启动了前端和后端几次。
我想这可能与代码的顺序有关,所以我移动了entries.delete after entries.get、entries.post和entries. put。
我在下面写了一些代码。
entryController.js
const express = require("express");
const entries = express.Router();
const {
getAllEntries,
getEntry,
createEntry,
updateEntry,
deleteEntry,
} = require("../queries/entries")
[snip]
// ===== DELETE =====
entries.delete('/entries/:id', async(req, res) => {
const id = req.params.id;
const deletedEntry = await deleteEntry(id);
if (deletedEntry.id) {
res.status(200).json(deletedEntry);
} else {
res.status(404).json( {error: "Entry not found."} );
}
});
module.exports = entries;
entries.js
const db = require("../db/dbconfig");
[SNIP]
// === DELETE AN ENTRY (DESTROY) ===
const deleteEntry = async(id) => {
try {const deletedEntry = await db.one(
"DELETE FROM entries WHERE id = $1 RETURNING *", id
);
return deletedEntry;
} catch(error){
return error;
}
};
[SNIP]
module.exports = {
getAllEntries,
getEntry,
createEntry,
updateEntry,
deleteEntry,
billsToSendToInsurance,
}
我认为路线处理是好的,如果这甚至是相关的。
const deleteEntry = () => {
console.log("deleteEntry");
const deleteURL = `${API}/entries/${id}`;
console.log(deleteURL);
axios.delete(deleteURL, { headers: { 'Content-Type': 'application/json' } })
.then((response) => {
navigate(`/entries`);
})
.catch((error) => console.error("Error Deleting entry:", error));
};
我不知道这是否相关,但我也不能更新一个条目,而不更新所有条目。
有什么建议吗?
编辑添加以回应评论:在app.js中,
const entryController = require("./controllers/entryController.js");
app.use("/entries", entryController);
deleteURL中的API为
const API = process.env.REACT_APP_API_URL;
1条答案
按热度按时间rsl1atfo1#
问题是,您正在将所有
/entries
调用重定向到entryController然后在控制器内部调用delete,再次在路径中使用
/entries
因此,这实际上使路由为
${API}/entries/entries/:id
,这显然不存在。要解决这个问题,只需在删除调用时删除
/entries
然后它应该工作。