当前位置: 首页 > 知识库问答 >
问题:

如何使用mern删除特定id的帖子?

孟和怡
2023-03-14

我试图删除特定id的帖子,但它给我错误为:代理错误:无法代理请求 /api/posts从localhost:3001http://localhost:8000。有关更多信息,请参阅https://nodejs.org/api/errors.html#errors_common_system_errors(ECONNREFUSED)。

这是我的行动:

export const deletePost = (id) => async (dispatch) => {
  try {
    dispatch({
      type: DELETE_POST_LOADING,
    });
    const res = await axios.delete(`/api/post/${id}`);
    dispatch({
      type: DELETE_POST_SUCCESS,
      payload: { id: id },
    });
  } catch (error) {
    dispatch({
      type: DELETE_POST_FAIL,
      payload: error,
    });
  }
};

这是我的减速机:

case DELETE_POST_SUCCESS:
      const new_data = state.posts;

      const item_index = new_data.findIndex(
        (element) => element.id === action.payload.id
      );
      new_data.splice(item_index, 1);

      return {
        loading: false,
        posts: new_data,
      };

这是我的组件中使用的代码:

 const handleDelete = (id) => {
    setItemId(id);
    id && itemId != null && dispatch(deletePost(itemId));
  };

这是我的post控制器,它也没有获取id的数据

const getSinglePost = async (req, res) => {
  const _id = req.params;
  console.log(id);
  const article = await Post.findById({ _id });
  res.json(article);
  if (article) {
    console.log("Fetched data with id");
  } else {
    console.log("Didnot fetched");
  }
};

用户界面代码

import React, { useState, useEffect } from "react";
import { withStyles, makeStyles } from "@material-ui/core/styles";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableHead from "@material-ui/core/TableHead";
import TableRow from "@material-ui/core/TableRow";
import Paper from "@material-ui/core/Paper";
import { useDispatch, useSelector } from "react-redux";
import { getPost, deletePost } from "../../actions/postAction";
import VisibilityIcon from "@material-ui/icons/Visibility";
import EditIcon from "@material-ui/icons/Edit";
import DeleteIcon from "@material-ui/icons/Delete";
import "./Dashboard.css";
import { useHistory } from "react-router";
import { Button } from "@material-ui/core";
const StyledTableCell = withStyles((theme) => ({
  head: {
    backgroundColor: theme.palette.common.black,
    color: theme.palette.common.white,
  },
  body: {
    fontSize: 14,
  },
}))(TableCell);

const StyledTableRow = withStyles((theme) => ({
  root: {
    "&:nth-of-type(odd)": {
      backgroundColor: theme.palette.action.hover,
    },
  },
}))(TableRow);

const useStyles = makeStyles({
  table: {
    minWidth: 700,
  },
});

export default function CustomizedTables() {
  const classes = useStyles();
  const [articles, setArticles] = useState([]);
  const [itemId, setItemId] = useState("");

  const dispatch = useDispatch();
  const articleState = useSelector((state) => state.post_Reducer);

  useEffect(() => {
    dispatch(getPost());
  }, []);

  useEffect(() => {
    const data = articleState.posts;
    console.log("aayo", data);
    setArticles(data);
  }, [articleState]);

  const history = useHistory();
  const logout = () => {
    localStorage.removeItem("userInfo");
    history.push("/");
  };

  function passID(id) {
    console.log("itemid", id);
    history.push({
      pathname: `/article/${id}`,
    });
  }

  const handleDelete = (id) => {
    dispatch(deletePost(id));
  };

  return (
    <>
      <div className="navigationButtons">
        <Button variant="contained" color="secondary" onClick={logout}>
          Logout
        </Button>
        <Button variant="contained" onClick={() => history.push("/createpost")}>
          Create New Article
        </Button>
      </div>
      <TableContainer component={Paper}>
        <Table className={classes.table} aria-label="customized table">
          <TableHead>
            <TableRow>
              <StyledTableCell
                style={{ width: "150px" }}
                className="tableRow"
                align="left"
              >
                ID
              </StyledTableCell>
              <StyledTableCell className="tableRow" align="left">
                Title
              </StyledTableCell>
              <StyledTableCell className="actionRow" align="center">
                Action
              </StyledTableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {articles?.map((article) => (
              <StyledTableRow key={article._id}>
                <StyledTableCell
                  className="dataRow"
                  align="left"
                  component="th"
                  scope="row"
                >
                  {article._id}
                </StyledTableCell>
                <StyledTableCell className="dataRow" align="left">
                  {article.title}
                </StyledTableCell>
                <StyledTableCell className="actionRow" align="center">
                  <td className="actions">
                    <VisibilityIcon
                      onClick={() => passID(article._id)}
                      style={{ color: "green", fontSize: "20px" }}
                    />
                    <EditIcon style={{ color: "blue", fontSize: "20px" }} />
                    <DeleteIcon
                      onClick={() => {
                        handleDelete(article._id);
                      }}
                      style={{ color: "red", fontSize: "20px" }}
                    />
                  </td>
                </StyledTableCell>
              </StyledTableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>
    </>
  );
}

有人能帮我吗?

共有2个答案

凌恩
2023-03-14

您需要刷新页面/重新加载应用程序的原因是由于减速器中的状态突变。

case DELETE_POST_SUCCESS:
  const new_data = state.posts; // <-- new_data is reference to state

  const item_index = new_data.findIndex(
    (element) => element.id === action.payload.id
  );
  new_data.splice(item_index, 1); // array.splice mutates array in place

  return {
    loading: false,
    posts: new_data, // <-- save posts state reference back into state
  };

在React中更新状态时,必须始终返回新的引用对象,在本例中为数组。只需过滤posts数组。不要忘记也浅复制现有状态,除非您特别删除部分状态。

case DELETE_POST_SUCCESS:
  return {
    ...state
    loading: false,
    posts: state.posts.filter((element) => element.id !== action.payload.id),
  };
盖锐进
2023-03-14
Can u try like this 
const getSinglePost = async (req, res) => {
  const id = req.params.id;
  console.log(id);
  const article = await Post.findById({_id:id});
  res.json(article);
  if (article) {`enter code here`
    console.log("Fetched data with id");
  } else {
    console.log("Didnot fetched");
  }
};
 类似资料:
  • 我试图删除使用它的ID的消息。我在用discord.py. 逻辑流 用户发送命令。消息hi Bot删除"!消息hi"使用用户的消息ID 机器人说hi" 我已经想出了如何让它复制我的消息,但我很难让它删除它们。我不想说它在邮件被删除之前就删除了它,否则在繁忙的服务器上它可能无法工作。我想获取命令消息的ID,然后使用它的ID删除它。

  • 我正在尝试删除右边的最后一个边框,如下图所示。我该怎么处理这个? 我的代码: null null

  • 创建帖子时,我的用户会提供一个外部链接。如果删除了外部链接,本地帖子也应该删除。为了实现这一点,我尝试运行以下代码... ...但是我得到了这些错误... 警告:get_headers(): php_network_getaddresses: getaddrinfo failed: name or service in /home/cornwal2/public_html/listings/wp-

  • 我有一个包含许多列和观察值的数据帧(et5)。其中一列是“MRN”,这是数据框中每个观察/患者的唯一代码,另一列是“年龄”。首先,如何将所有MRN和年龄并排显示?第二,我如何通过MRN删除特定观察/患者。 我的数据框(et5)是什么样子的

  • 问题内容: 我想做的只是删除我在日历中保存的内容,而不是删除日历中已经存在的所有内容。为此,我使用以下代码。但是它将删除日历的所有内容。那么谁能告诉我如何预防呢? 因此,我要删除的仅是我输入的条目。 删除活动 问题答案: 从日历中读取数据后,只需尝试一下即可。 向日历添加单次事件 要将条目添加到特定日历,我们需要配置一个日历条目以使用ContentValues进行插入,如下所示: 每个事件都需要绑

  • 问题内容: 我想删除多条线图中的特定线。贝娄是一个给我的例子,这对我来说还不够,因为它仅删除最后绘制的线条,而不删除我要删除的线条。我怎样才能做到这一点?如何在整个程序中寻址特定行(按名称,编号,参考)并删除该行? 问题答案: 几乎所有的绘图功能都返回对先前创建的对象的引用: 如果您有参考文献,则可以通过 (doc)函数ex删除艺术家: