我正在按照node.js 和express api 教程来构建费用跟踪器。我正在邮递员上发出获取、发布和删除请求。 GET 和 POST 请求工作正常,但当我发出 DELETE 请求时,我的状态为
500
。考虑以下几点:
帖子:
http://localhost:5000/api/v1/transactions
输出:
{
"success": true,
"data": {
"text": "Payment",
"amount": -100,
"_id": "6662fcccc69f5411146a4205",
"createdAt": "2024-06-07T12:27:56.355Z",
"__v": 0
}
}
获取:
http://localhost:5000/api/v1/transactions
输出:
{
"success": true,
"count": 3,
"data": [
{
"_id": "6662f5b0432dc072d8281525",
"text": "Bonus",
"amount": 50,
"createdAt": "2024-06-07T11:57:36.455Z",
"__v": 0
},
{
"_id": "6662f654432dc072d8281528",
"text": "Books",
"amount": 150,
"createdAt": "2024-06-07T12:00:20.681Z",
"__v": 0
},
{
"_id": "6662fcccc69f5411146a4205",
"text": "Payment",
"amount": -100,
"createdAt": "2024-06-07T12:27:56.355Z",
"__v": 0
}
]
}
注:
I earlier added **Bonus** and **Books**
DELETE:说我想删除“付款”,所以我得到它的
_id
并执行以下操作:
http://localhost:5000/api/v1/transactions/6662fcccc69f5411146a4205
输出:
{
"success": false,
"error": "Server Error"
}
控制器文件(transactions.js)如下:
const Transaction = require('../models/Transaction');
// @desc Get all transactions
// @route GET /api/vi/transactions
// @access Public
exports.getTransactions = async (req, res, next) => {
// res.send('GET transactions');
try {
const transactions = await Transaction.find();
return res.status(200).json({
success: true,
count: transactions.length,
data: transactions
});
} catch (err) {
return res.status(500).json({
success: false,
error: 'Server Error'
});
}
}
// @desc Add transaction
// @route POST /api/vi/transactions
// @access Public
exports.addTransaction = async (req, res, next) => {
// res.send('POST transaction');
try {
const { text, amount } = req.body;
const transaction = await Transaction.create(req.body);
return res.status(201).json({
success: true,
data: transaction
});
} catch (err) {
if (err.name === 'ValidationError') {
const messages = Object.values(err.errors).map(val => val.message);
return res.status(400).json({
success: false,
error: messages
});
} else {
return res.status(500).json({
success: false,
error: 'Server Error'
});
}
}
}
// @desc Delete transaction
// @route DELETE /api/vi/transactions/:id
// @access Public
exports.deleteTransaction = async (req, res, next) => {
// res.send('DELETE transaction');
try {
const transaction = await Transaction.findById(req.params.id);
if(!transaction) {
return res.status(404).json({
success: false,
error: 'No transaction found'
});
}
await transaction.remove(); //remove method is called on the resource
return res.status(200).json({
success: true,
data: {}
});
} catch (err) {
return res.status(500).json({
success: false,
error: 'Server Error'
});
}
}
请有人帮忙。我该如何解决这个问题?
执行
console.log(err)
后,我得到了TypeError: transaction.remove is not a function
,即它已被弃用。
相反,我使用 const transaction = await Transaction.findByIdAndDelete(req.params.id)
解决了这个问题。
findByIdAndDelete
查找并删除文档,返回删除的文档。
它返回已删除的文档,如果不存在具有给定 _id 的文档,则返回 null。
我注释掉了
await transaction.remove()
,因为 findByIdAndDelete
可以完成这项工作。
还有另一种方法可以解决这个问题: 保持
findById
不变,只需执行 await transaction.deleteOne()
即可。这也能完成工作。
不管怎样,这个问题已经解决了。感谢@jQueeny!