获取VK帖子存入PostgreSQL失败及'create'未定义错误排查
问题描述
尝试将VK平台帖子数据存入PostgreSQL数据库时无任何结果,且报错:Cannot read properties of undefined (reading 'create')。已成功获取VK帖子内容,但无法写入数据库。相关代码及控制台输出如下:
Entity代码
@Entity('tutors') export class TutorEntity { @PrimaryGeneratedColumn() id: string; @Column() posts: string; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updateAt: Date; }
创建帖子DTO
export class CreateTutorDto { @ApiProperty() posts: string; }
Controller代码
@Controller('tutors') export class TutorsController { constructor(private readonly tutorsService: TutorsService) {} @Get() create() { return this.tutorsService.findPostFirstGroup(); } }
Service代码
@Injectable() export class TutorsService { constructor( @InjectRepository(TutorEntity) private repository: Repository<TutorEntity>, ) {} create(dto: { posts: string; }) { return this.repository.save(dto); } console.log(this.repository) await this.repository.create( { posts: 'post', } ) }
Module代码
@Module({ imports: [ TypeOrmModule.forFeature([TutorEntity]), ConfigModule.forRoot(), HttpModule, ], controllers: [TutorsController], providers: [TutorsService], exports: [TutorsService], }) export class TutorsModule {}
控制台输出
repositories: Map(2) { [class UserEntity] => [Repository], [class TutorEntity] => [Circular *1] },
核心问题排查
- Service语法错误:类作用域内直接编写
console.log和await代码属于非法操作,类初始化时repository还未完成依赖注入,此时this.repository为undefined,直接触发Cannot read properties of undefined (reading 'create')错误。 - 方法调用不匹配:Controller的
@Get()方法调用findPostFirstGroup(),但Service中未定义该方法,导致接口无法执行入库逻辑。 - Entity类型不兼容:
@PrimaryGeneratedColumn()默认生成数字类型主键,但代码中定义id为string,会导致数据库映射失败。 - 字段拼写错误:Entity中
updateAt应为updatedAt,与@UpdateDateColumn()的默认命名规范一致。
修复后的完整解决方案
1. 修正Entity代码
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; @Entity('tutors') export class TutorEntity { @PrimaryGeneratedColumn() id: number; // 改为number,匹配默认自增主键类型 @Column() posts: string; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; // 修正拼写错误 }
2. 修正Service代码(将逻辑移入方法)
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { TutorEntity } from './tutor.entity'; import { CreateTutorDto } from './create-tutor.dto'; @Injectable() export class TutorsService { constructor( @InjectRepository(TutorEntity) private readonly repository: Repository<TutorEntity>, ) {} // 实现获取VK帖子并存库的核心方法 async findPostFirstGroup() { // 替换为你的VK帖子获取逻辑,比如调用VK API返回的内容 const vkPostContent = '这里填入从VK获取到的帖子内容(建议转成JSON字符串存储)'; // 创建实体并保存到数据库 const newPost = this.repository.create({ posts: vkPostContent }); return await this.repository.save(newPost); } // 通用创建方法 async create(dto: CreateTutorDto) { return await this.repository.save(dto); } }
3. 修正Controller代码(匹配Service方法)
import { Controller, Get, Post, Body } from '@nestjs/common'; import { TutorsService } from './tutors.service'; import { CreateTutorDto } from './create-tutor.dto'; @Controller('tutors') export class TutorsController { constructor(private readonly tutorsService: TutorsService) {} @Get('vk-save') // 给接口设置清晰路径 async fetchAndSaveVkPosts() { return this.tutorsService.findPostFirstGroup(); } // 可选:提供手动创建帖子的POST接口 @Post() async create(@Body() createTutorDto: CreateTutorDto) { return this.tutorsService.create(createTutorDto); } }
4. 确认根模块TypeOrm配置
确保根模块(如app.module.ts)已正确配置PostgreSQL连接:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TutorsModule } from './tutors/tutors.module'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: process.env.NODE_ENV === 'development', // 开发环境可开启,生产环境必须关闭 }), TutorsModule, ], }) export class AppModule {}
额外注意事项
- 确保PostgreSQL服务正常运行,数据库连接参数(主机、端口、用户名、密码、库名)配置正确
- 生产环境必须关闭
synchronize: true,避免自动修改数据库结构导致数据丢失 - 若存储VK复杂帖子结构,建议将
posts字段类型设为jsonb(修改Entity的@Column({ type: 'jsonb' }))
内容的提问来源于stack exchange,提问作者Максим Дмитриевич
相关产品推荐
相关产品推荐

