Typescript 在这个端点中,我的NestJS控制器和TypeORM发生了什么?
我遇到了一个非常奇怪的错误,我真的不知道为什么会发生 我正在尝试查询所有博客帖子状态(只有三种——草稿、已发布和已存档)以发送回我的前端。在我的控制器中,我将路线定义为:Typescript 在这个端点中,我的NestJS控制器和TypeORM发生了什么?,typescript,nestjs,typeorm,Typescript,Nestjs,Typeorm,我遇到了一个非常奇怪的错误,我真的不知道为什么会发生 我正在尝试查询所有博客帖子状态(只有三种——草稿、已发布和已存档)以发送回我的前端。在我的控制器中,我将路线定义为: @Controller('blog/posts/statuses') export class BlogPostStatusController { constructor( private readonly blogPostStatusService: BlogPostStatusService
@Controller('blog/posts/statuses')
export class BlogPostStatusController {
constructor(
private readonly blogPostStatusService: BlogPostStatusService
) { }
@Get('')
@HttpCode(200)
@UseGuards(JwtAuthGuard)
async getPostStatuses(@Req() request: Request): Promise<BlogPostStatus[]> {
const statuses = await this.blogPostStatusService.getStatuses();
if(statuses.length === 0) throw new BlogPostStatusesWereNotFoundException();
return statuses;
}
}
当向端点发出请求(api/blog/posts/statuses
)时,它会抛出一个500错误,因为PostgreSQL正在接收类型integer的无效输入语法:“statuses”
:
引发异常:QueryFailedError:类型integer的输入语法无效:“状态”
在新的QueryFailedError(C:\dev\repos\web\mattmaxwell\api\node\u modules\typeform\error\QueryFailedError.js:11:28)
在Query.callback(C:\dev\repos\web\mattmaxwell\api\node\u modules\typeorm\driver\postgres\postgreskeryrunner.js:176:38)
位于Query.handleError(C:\dev\repos\web\mattmaxwell\api\node\u modules\pg\lib\Query.js:139:19)
在客户端。\u handleErrorMessage(C:\dev\repos\web\mattmaxwell\api\node\u modules\pg\lib\Client.js:326:17)
在Connection.emit(events.js:315:20)
在C:\dev\repos\web\mattmaxwell\api\node\u modules\pg\lib\connection.js:109:12
在Parser.parse(C:\dev\repos\web\mattmaxwell\api\node\u modules\pg protocol\dist\Parser.js:40:17)
在插座上。(C:\dev\repos\web\mattmaxwell\api\node\u modules\pg protocol\dist\index.js:8:42)
在Socket.emit(events.js:315:20)
在addChunk(_stream_readable.js:295:12){
长度:173,
严重性:“错误”,
代码:“22P02”,
细节:未定义,
提示:未定义,
位置:未定义,
内部位置:未定义,
internalQuery:未定义,
其中:未定义,
模式:未定义,
表:未定义,
列:未定义,
数据类型:未定义,
约束:未定义,
文件:“d:\\pginstaller\u 12.auto\\postgres.windows-x64\\src\\backend\\utils\\adt\\numultils.c”,
行:“259”,
例行程序:“pg_strotInt32”,
查询:'选择“bp”,“id”作为“bp\U id”,“bp”,“title”作为“bp\U title”,“bp”,“preview”作为“bp\U preview”,“bp”,“content”作为“bp\U content”,“bp”,“image\u url”作为“bp\U image\u url”,“bp”,“created\u at”作为“bp\u created\u at”,“bp”,“updated\u at”作为“bp\u update”
ed_at“,”bp“,”author_id“为”bp_author_id“,”bp“,”status_id“为”bp_status_id“,”ba“,”id“为”ba_id“,”ba“,”first_name“为”ba_first_name“,”last_name“为”ba_last_name“,”bps“,”id“为”bps_id“,”bps“,”status“为”bps_status“,”bt”
“id”为“bt_id”,“bt”。“name”为“bt_name”,“bt”。“description”为“bt_description”,“bt”。“created_at”为“bt_created_at”,“bt”。“updated_at”为“bt_updated_at”为“bt_updated_at”,从“blog_post”“bp”左键加入“blog_author”“ba”。“id”=“bp”。“autho”
r_id“LEFT JOIN”blog_post_status“bps”ON“bps”。“id”=“bp”。“status_id”LEFT JOIN“blog_post_主题”blog_主题“bp”ON“bp”;“blog_post_id”=“bp”。“id”LEFT JOIN“blog_主题”ON“bt”;“id”=“bp”;“blog_主题”id“bp”在“bp”的位置
id“=$1”,
参数:[“状态”]
}
正如您所看到的,无论如何查询的表都是错误的。我不知道为什么我的端点会被读取到查询中,但我注意到如果我将decorator更改为@Get('statuses')
,那么查询就成功了(新端点变成api/blog/posts/statuses/statuses
)。不幸的是,这不是我想要的API端点,但出于某种原因,它可以工作,而另一个不能。到目前为止,数据被硬编码到我的前端,它工作得很好,特别是考虑到只有三个可能的记录,但这是一个我不喜欢的黑客解决方案
我可以肯定的是,在decorator中有一个空字符串不是问题。就在这之前,我在控制器中为我的帖子编写了这段代码(decorator是@Get('statuses')
导致了api/blog/posts/statuses
)的相同端点),但这也引发了完全相同的错误。我知道我正在尝试做的是可能的,因为我有另一个实体具有不同的状态(活动和非活动),查询具有相同控制器/端点设置的实体就可以了。这似乎没有理由发生,这就是为什么我如此困惑的原因。任何帮助都将不胜感激
注意:即使将状态控制器更改为
@controller('blog/statuses')
也有效,因此我认为这是端点本身的问题,但是。。。为什么?这似乎是合理的期望,但如果我遗漏了一些东西,我将非常感谢任何人分享一些知识。解决方案:我不知道为什么我没有早些尝试,但在我的BlogModule导入中,将我的BlogPostStatusController放在我的BlogPostController之前可以让它工作。有人知道为什么会这样吗?这仍然不能解释为什么当我没有把它作为一个单独的控制器/服务时它就不起作用了(尽管路由是在控制器的最末端定义的),但是。。。至少它现在可以工作了。根据您的回答,您可能有一个控制器路径,其中包含类似于blog/posts/:parameter的内容。当您有此功能时,无论您是否有命名路由,如果先注册,它将首先被匹配,并且此处理程序将生效,这可能就是为什么使用status
参数进行查询,试图匹配Id,这显然永远不会发生。请在回答中继续回答。不要问他们的问题。请访问和,了解有关堆栈溢出的答案是如何工作的。
@Injectable()
export class BlogPostStatusService {
constructor(
@InjectRepository(BlogPostStatus)
private readonly blogPostStatusRepository: Repository<BlogPostStatus>
) { }
public async getStatuses(): Promise<BlogPostStatus[]> {
return await this.blogPostStatusRepository
.createQueryBuilder('bps')
.getMany();
}
}
Exception thrown: QueryFailedError: invalid input syntax for type integer: "statuses"
at new QueryFailedError (C:\dev\repos\web\mattmaxwell\api\node_modules\typeorm\error\QueryFailedError.js:11:28)
at Query.callback (C:\dev\repos\web\mattmaxwell\api\node_modules\typeorm\driver\postgres\PostgresQueryRunner.js:176:38)
at Query.handleError (C:\dev\repos\web\mattmaxwell\api\node_modules\pg\lib\query.js:139:19)
at Client._handleErrorMessage (C:\dev\repos\web\mattmaxwell\api\node_modules\pg\lib\client.js:326:17)
at Connection.emit (events.js:315:20)
at C:\dev\repos\web\mattmaxwell\api\node_modules\pg\lib\connection.js:109:12
at Parser.parse (C:\dev\repos\web\mattmaxwell\api\node_modules\pg-protocol\dist\parser.js:40:17)
at Socket.<anonymous> (C:\dev\repos\web\mattmaxwell\api\node_modules\pg-protocol\dist\index.js:8:42)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:295:12) {
length: 173,
severity: 'ERROR',
code: '22P02',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'd:\\pginstaller_12.auto\\postgres.windows-x64\\src\\backend\\utils\\adt\\numutils.c',
line: '259',
routine: 'pg_strtoint32',
query: 'SELECT "bp"."id" AS "bp_id", "bp"."title" AS "bp_title", "bp"."preview" AS "bp_preview", "bp"."content" AS "bp_content", "bp"."image_url" AS "bp_image_url", "bp"."created_at" AS "bp_created_at", "bp"."updated_at" AS "bp_updat
ed_at", "bp"."author_id" AS "bp_author_id", "bp"."status_id" AS "bp_status_id", "ba"."id" AS "ba_id", "ba"."first_name" AS "ba_first_name", "ba"."last_name" AS "ba_last_name", "bps"."id" AS "bps_id", "bps"."status" AS "bps_status", "bt
"."id" AS "bt_id", "bt"."name" AS "bt_name", "bt"."description" AS "bt_description", "bt"."created_at" AS "bt_created_at", "bt"."updated_at" AS "bt_updated_at" FROM "blog_post" "bp" LEFT JOIN "blog_author" "ba" ON "ba"."id"="bp"."autho
r_id" LEFT JOIN "blog_post_status" "bps" ON "bps"."id"="bp"."status_id" LEFT JOIN "blog_post_topics_blog_topic" "bp_bt" ON "bp_bt"."blog_post_id"="bp"."id" LEFT JOIN "blog_topic" "bt" ON "bt"."id"="bp_bt"."blog_topic_id" WHERE "bp"."
id" = $1',
parameters: [ 'statuses' ]
}