【问题标题】:How to define Mongoose Schema for delete method如何为删除方法定义 Mongoose Schema
【发布时间】:2021-09-10 05:43:43
【问题描述】:

我无法删除 MongoDB 列表中的项目。

很遗憾,当在ExpensesListItem.tsx 中调用axios.delete 方法时,MongoDB 列表中的项目并没有被删除(没有错误信息打印到控制台)。

代码有什么问题(可能是猫鼬模式)?

ExpensesListItem.tsx

import React from "react";
import { IconButton, ListItem, ListItemSecondaryAction, ListItemText } from "@material-ui/core";
import DeleteIcon from '@material-ui/icons/Delete';
import { ExpenseAndAmountObject } from '../ExpenseAndAmountObject';
import axios from 'axios';
interface Props {
    expenseTitle: string;
    expenseAmount: string;
    currencySymbol: string;
    item: ExpenseAndAmountObject;
    expenseAndAmountList: Array<ExpenseAndAmountObject>;
    setExpenseAndAmountList: (value: Array<ExpenseAndAmountObject>) => void;
  }

const ExpensesListItem: React.FC<Props> = (
    {
        expenseTitle,
        expenseAmount,
        currencySymbol,
        item,
        expenseAndAmountList,
        setExpenseAndAmountList
    }: Props) => {

        const DeleteListItem = (toBeDeletedItemId: any) => {
        setExpenseAndAmountList(expenseAndAmountList.filter(el => el._id !== toBeDeletedItemId));

        axios.delete('http://localhost:4000/app/expenseslist', { data: { itemId: toBeDeletedItemId } ) 
        .catch(function (error) {
            console.log(error);
        });
    }
    return (
        <>
            <ListItem className="list-item">
                <ListItemText primary={expenseTitle} secondary={expenseAmount + currencySymbol} />
                <ListItemSecondaryAction>
                    <IconButton onClick={()=>DeleteListItem(item._id)} edge="end">
                        <DeleteIcon className="delete-btn" />
                    </IconButton>
                </ListItemSecondaryAction>
            </ListItem>
        </>
      );
  }
  
export default ExpensesListItem;

routes.js

 router.delete('/expenseslist', (request, response) => {
    let itemId = request.body._id;
    ExpenseAndAmountTemplate.findByIdAndRemove(itemId, function(err){
        if(err){
            response.send("/Could not delete the item...");
        } else {
            response.send("/Expenses and amount item was deleted succesfully...");
        }
     });
 });

ExpenseAndAmountModel.js

const mongoose = require('mongoose');

const ExpenseAndAmountTemplate = new mongoose.Schema({
    _id: {
        type:String,
        required:false
    },
    expenseTitle: {
        type:String,
        required:true
    },
    expenseAmount: {
        type:String,
        required:true
    }
});

module.exports = mongoose.model('ExpenseAndAmountData', ExpenseAndAmountTemplate);

【问题讨论】:

  • 因为您将itemId 参数传递给axios.delete,例如{ data: { itemId: toBeDeletedItemId },所以request.body 应该是request.body.itemId 而不是request.body._idroutes.js内。
  • 我已将其替换为 { data: { _id: toBeDeletedItemId } } ExpensesListItem.tsx。但是结果是一样的——ExpensesListItem.tsx中调用axios.delete方法时,MongoDB列表的item并没有被删除
  • 另外我已经从猫鼬模式中删除了_id,现在它可以正常工作了,谢谢!

标签: javascript reactjs mongodb mongoose axios


【解决方案1】:

您正在尝试使用属性“itemId”进行删除,但您需要 request.body._id 才能删除该项目。因此,您的请求正文中需要 _id 属性,而不是 itemId。

  axios.delete('http://localhost:4000/app/expenseslist', { _id:toBeDeletedItemId } ) 
        .catch(function (error) {
            console.log(error);
        });

如果我没记错的话,这应该可以工作。

【讨论】:

  • 自从用{ _id:toBeDeletedItemId } 替换后,我得到的Argument of type '{ itemId: any; } 不能分配给“AxiosRequestConfig”类型的参数,因此我将其替换为{ data: { _id: toBeDeletedItemId } }) 和结果是一样的——ExpensesListItem.tsx中调用axios.delete方法时,MongoDB列表的item没有被删除
  • 另外我已经从猫鼬模式中删除了_id,现在它可以正常工作了,感谢您的帮助
猜你喜欢
  • 2021-03-22
  • 2019-10-03
  • 2011-11-21
  • 1970-01-01
  • 2023-03-14
  • 2015-04-11
  • 2023-03-17
  • 2015-02-04
  • 2021-08-27
相关资源
最近更新 更多