尽管视图初始化,有时仍会显示已删除的项目-Vue,Node.js [重复]

Posted

技术标签:

【中文标题】尽管视图初始化,有时仍会显示已删除的项目-Vue,Node.js [重复]【英文标题】:Sometimes deleted item is still displayed although view initialization - Vue, Node.js [duplicate] 【发布时间】:2021-07-30 15:26:51 【问题描述】:

我在 Vue.js、Node.js 和 MongoDB 中创建应用程序。我有一个项目列表,每个项目旁边都有删除按钮。通常它可以工作,但是一次,例如 20 次删除,被删除的项目保留在列表中,尽管列表在每次删除后初始化。手动刷新页面后,删除的项目消失了。如何解决?

vue 组件:

 methods: 
    async initialize() 
      return Service.getTool()
        .then((response) => 
          this.tools = response;
        )
        .catch((error) => 
          this.handleError(error, this.errors);
        )
        .finally(() => 
        );
    ,
   async deleteItem(id) 
      await Service.deleteTool(id);
      await this.initialize();
    ,

服务:

    static async getTool() 
        const res = await api.get('tool/get')
        try 
            return res.data;
         catch (err) 
            return err;
        
    
    static deleteTool(id) 
        return api.delete(`$'delete'/$id`);
    

后端:

router.delete('/delete/:id', (req, res) => 
  Tool.deleteOne( _id: req.params.id , function (err) 
    if (!err) 
      return res.json('Item has been deleted');
    
    else 
      res.status(500).send(err);
    
  );
)

【问题讨论】:

可能有网络/服务器错误? 但是删除的项目在数据库中被删除了,只是视图显示不正确 没问题,只需尝试 remove( _id: req.params.id ) 方法而不是 2 个操作 findOne 和 remove 参见 answer router.remove 是你的主函数,不要改变它,在那个函数里面只写remove方法而不是findOne。喜欢Tool.remove( _id: req.body.id ... 现在效果很好。非常感谢@turivishal :)) 【参考方案1】:

该项目在报告时未被删除:

  tool.remove();
  return res.json('Item has been deleted');

当有许多项目要处理时会出现问题,这意味着竞争条件需要足够长的时间才能显示出来。

基于回调的 API 对于所有主要库都已过时。它应该已经通过 Promise 实现了:

try 
  const tool = await Tool.findOne( _id: req.params.id );
  ...
  await tool.remove();
  return res.json('Item has been deleted');

【讨论】:

我使用了从评论到这个问题的解决方案——我使用了 deleteOne 而不是 findOne,它也可以正常工作。我通过向其中添加更新的后端代码来编辑我的问题。你能检查一下,然后说这个解决方案是更好的还是你的? 最好使用 deleteOne 而不是 findOne,因为它执行的查询更少。 deleteOne 适用于这种特定情况,因为 1 个查询没有竞争条件。但不会阻止与更复杂查询的回调相关的问题。您正在使用过时的 API,请尽可能遵守承诺。 谢谢。我会照你写的去做。我不知道我使用的是过时的 API。能否请您给我发送更新 API 的链接?因为在网站上,每个解决方案都是如此不同,我不知道哪个是正确的。 问题说你使用Mongo,但实际上你使用Mongoose,不是吗?官方文档是最新的。 是的,我会检查的。谢谢。【参考方案2】:

我从评论中使用了@turivishal 的解决方案:

router.delete('/delete/:id', (req, res) => 
  Tool.deleteOne( _id: req.params.id , function (err) 
    if (!err) 
      return res.json('Item has been deleted');
    
    else 
      res.status(500).send(err);
    
  );
)

【讨论】:

以上是关于尽管视图初始化,有时仍会显示已删除的项目-Vue,Node.js [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尽管已正确初始化,XIB 视图仍不显示任何内容

尽管没有登录 iTunes 帐户,iOS 仍会恢复应用内购买

即使在从钥匙串访问和 App Store Connect 中删除后,重新启动 Xcode 时,已删除的 iOS 证书仍会继续显示在钥匙串中

即使代码库已更改,SonarQube 已修复的问题仍会显示

当我使用 Health App 中的 Delete All 操作时,Health kit 仍会返回已删除的数据

在 qListView 中,已删除的项目不会在视图中更新