在 Postman 中删除请求时收到错误 500

问题描述 投票:0回答:1

我正在按照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'
        });
    }
}

请有人帮忙。我该如何解决这个问题?

node.js express postman http-status-code-500
1个回答
0
投票

执行

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!

© www.soinside.com 2019 - 2024. All rights reserved.