首页 > 解决方案 > 一个函数在我用 Postman 测试时有效,但在我的客户中不起作用

问题描述

我的客户端中有一个按钮,需要根据 ID 从 MongoDB 集合中删除文档。这是它在后端的样子:

index.js:

router.post('/deletetask', async function (req, res, next) {
  let result = await dbModule.deleteTask(req.body.taskID);
  res.json(result);
});

dbModule.js(我创建的)

deleteTask: (taskID) => {
        return Task.findByIdAndDelete({_id: taskID});
    }

通过 Postman 运行它会返回一个结果,并且确实会从集合中删除该任务。我添加了客户端代码,如下所示:

这是 HTML:

<button class="btn btn-danger" (click)="deleteTask(task._id)">Delete
  <!-- There is an SVG icon here, removed for clarity -->
</button>

对应的 TS 组件:

deleteTask(taskID)
  {
    this.dbService.deleteTask(taskID).subscribe(data => {
      console.log(data);
    });
    this.router.navigate(['/tracker']); <!-- redirect to simulate a refresh -->
  }

服务代码:

deleteTask(taskID):Observable<any>
  {
    return this.http.post("http://localhost:3000/deletetask", taskID, httpOptions);
  }

当我添加客户端代码并尝试运行该函数时,我不断收到“POST http://localhost:3000/deletetask 400(错误请求)”

我不知道我做错了什么。我认为这可能是 CORS 的问题,但我添加了 CORS npm 包。我还有另一个添加任务的函数,它对服务器进行 POST 调用,并且工作正常,我的所有其他调用也是如此。

有任何想法吗?

标签: javascriptnode.jsangularexpressmongoose

解决方案


从我的评论扩展。

  1. 最好在订阅nextcomplete回调中移动路由。这样我们就可以确保 HTTP 请求在路由到其他地方之前完成。

  2. 根据您在后端访问值的方式,您实际上可能需要从客户端发送一个对象。尝试以下

this.http.post("...", { taskID: taskID }, httpOptions);

推荐阅读