You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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,提问作者Максим Дмитриевич

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:37:35