一个函数在我用 Postman 测试时有效,但在我的客户中不起作用

Posted

技术标签:

【中文标题】一个函数在我用 Postman 测试时有效,但在我的客户中不起作用【英文标题】:A function works when I test it with Postman, but doesn't work from my client 【发布时间】:2020-11-19 23:15:15 【问题描述】:

我的客户端中有一个按钮,需要根据 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 (Bad Request)”

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

有什么想法吗?

【问题讨论】:

此问题中没有足够的信息来诊断问题。专注于 HTTP,有效的 HTTP 请求和无效的 HTTP 请求有什么区别? 1.您需要在订阅中移动刷新调用,以确保在重新加载页面之前完成 HTTP 请求。 2.尝试将ID作为对象发送:this.http.post("...", taskID: taskID , httpOptions); @Liam 我已经检查了很多次,我认为这就是问题所在,并且没有区别,至少在客户端没有。 @MichaelD 好像作为对象传递有效,感谢您的快速响应! @DareRelaqz:我已经发布了答案。 【参考方案1】:

根据我的评论展开。

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

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

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

【讨论】:

我认为问题不在于路由,因为它被放置在请求函数之外。我仍然不明白为什么在这里传递一个对象(考虑到我可以只取值,然后在我的集合中搜索之前手动构建对象),但它有效,所以我不会抱怨 XD @DareRelaqz:路由与问题没有任何关系,只是避免任何潜在不需要的路由的提示。例如。如果请求需要更长的时间才能完成,并且您不想在请求完成之前路由等等。【参考方案2】:

这是解决方案:

return this.http.post("http://localhost:3000/deletetask", taskID, httpOptions);

【讨论】:

为什么?这如何解决任何问题? @Michael D 评论说,我不知道为什么这可以解决问题,但确实可以,所以我没有抱怨。如果它没有坏,就不要修理它。 post的第二个参数需要是一个对象。 taskID 与 taskID: taskID 相同

以上是关于一个函数在我用 Postman 测试时有效,但在我的客户中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我在 index.html 中指向 manifest.json 的链接在我运行反应脚本“yarn start”时有效,但在我运行“python3 manage.py runserver”时无效

错误 - ORA-00979: 不是 GROUP BY 表达式,但在我删除 f.film_no AS "Film Number" 时有效

通过向量迭代(使用迭代器)会导致 SIGSEGV 但在索引中使用时有效 - 那怎么样?

PHP 需要“guzzle.phar”会引发致命错误,但在页面刷新时有效

创建CCtexture时找不到Spritebuilder文件,但在创建CCsprite时有效?

GMail API:脚本在手动运行时有效,但在触发时无效