【问题标题】:How to set a different Http Status in loopback 4如何在环回 4 中设置不同的 Http 状态
【发布时间】:2022-04-27 22:26:34
【问题描述】:

我找不到任何关于如何使用环回 4 更改成功 HTTP 代码的资源。

例如:

201 在 post 方法上“创建”

204 删除方法上的“无内容”

我尝试在 @api 装饰器中指定这一点,但此更改并未反映在实际响应中。

感谢您的帮助!

【问题讨论】:

    标签: node.js loopbackjs


    【解决方案1】:

    我找不到任何关于如何使用环回 4 更改成功 HTTP 代码的资源。

    我们还没有对该功能的一流支持。当前的解决方法是将 Response 对象注入到您的控制器方法中,并直接通过 Express/Node.js 核心 API 设置状态码。

    export class TodoController {
      constructor(
        @repository(TodoRepository) protected todoRepo: TodoRepository,
        @inject(RestBindings.Http.RESPONSE) protected response: Response,
      ) {}
    
      async createTodo(@requestBody() todo: Todo): Promise<Todo> {
        this.response.status(401);
        // ...
      }
    }
    

    不要忘记从@loopback/rest 导入ResponseRestBindings,从@loopback/core 导入inject。在您的控制器中添加以下导入。

    import { Response, RestBindings } from '@loopback/rest';
    import { inject } from '@loopback/core';
    

    201 在 post 方法上“创建”

    请参阅https://github.com/strongloop/loopback-next/issues/788 中的讨论。困难的部分是如何确定在 Location 响应标头中发送什么 URL。

    204 删除方法上的“无内容”

    只需更改您的控制器方法以返回 undefined 而不是当前的 {count: 1} 对象。我相信这是由我们的lb4 工具搭建的 CRUD 控制器的默认行为。

    export class TodoController {
      // ...
      @del('/todos/{id}', {
        responses: {
          '204': {
            description: 'Todo DELETE success',
          },
        },
      })
      async deleteTodo(@param.path.number('id') id: number): Promise<void> {
        await this.todoRepo.deleteById(id);
      }
    

    【讨论】:

    • Miroslav,这对我不起作用。对于这个this.response.status(200),我收到错误Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures.
    • @AshutoshChamoli 您的Response 类型来自哪里?你是从@loopback/rest 导入的吗?直到最近,我们还必须在 TypeScript 的 libs 配置中包含 dom,因此,Response 也被定义为全局类型。这样的全局 DOM Response 的成员与 Express & Node.js 提供的 Response 对象不同
    • @MiroslavBajtoš 在从@loopback/rest 导入Response 之后,它现在可以工作了。也编辑了答案。谢谢:)
    • 另外,有没有一种方法可以让我更快地从环回团队获得对我的问题的答复。我们有一个在环回 4 上运行的生产服务。我们一直在进行大量更改,因此在开发和调试方面面临挑战。
    • @MiroslavBajtoš 如何在为控制器编写单元测试时模拟 Response。当我尝试模拟响应实例response = { status: sinon.stub()}时出现以下错误Type '{ status: SinonStub&lt;any[], any&gt;; }' is missing the following properties from type 'Response': sendStatus, links, send, json, and 72 more. [2740] let response: Response
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多