【发布时间】:2022-04-27 22:26:34
【问题描述】:
我找不到任何关于如何使用环回 4 更改成功 HTTP 代码的资源。
例如:
201 在 post 方法上“创建”
204 删除方法上的“无内容”
我尝试在 @api 装饰器中指定这一点,但此更改并未反映在实际响应中。
感谢您的帮助!
【问题讨论】:
标签: node.js loopbackjs
我找不到任何关于如何使用环回 4 更改成功 HTTP 代码的资源。
例如:
201 在 post 方法上“创建”
204 删除方法上的“无内容”
我尝试在 @api 装饰器中指定这一点,但此更改并未反映在实际响应中。
感谢您的帮助!
【问题讨论】:
标签: node.js loopbackjs
我找不到任何关于如何使用环回 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 导入Response 和RestBindings,从@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);
}
【讨论】:
this.response.status(200),我收到错误Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures.
Response 类型来自哪里?你是从@loopback/rest 导入的吗?直到最近,我们还必须在 TypeScript 的 libs 配置中包含 dom,因此,Response 也被定义为全局类型。这样的全局 DOM Response 的成员与 Express & Node.js 提供的 Response 对象不同
@loopback/rest 导入Response 之后,它现在可以工作了。也编辑了答案。谢谢:)
Response。当我尝试模拟响应实例response = { status: sinon.stub()}时出现以下错误Type '{ status: SinonStub<any[], any>; }' is missing the following properties from type 'Response': sendStatus, links, send, json, and 72 more. [2740] let response: Response