node.js - TypeORM ile ilişki verisi nasıl oluşturulur?
Bir kullanıcının ürünlerini oluşturup kaydetmeye çalışıyorum.
İşte benim denemem:
// userEntity.ts
import { Product } from '../product';
@Entity('user')
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({
unique: true
})
email: string;
@Column()
password: string;
@OneToMany(type => Product, product => product.user)
@JoinTable()
products: Product[];
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
// productEntity.ts
import { ProductCategory } from './productCategoryEntity';
import { User } from '../user';
@Entity('product')
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne(type => ProductCategory, {
eager: true,
cascade: true
})
@JoinTable()
category: ProductCategory;
@ManyToOne(type => User, user => user.products)
@JoinTable()
user: User;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
POST at http://localhost:4000/users/1/products. Bu, başarıyla bir ürün oluşturur ancak kullanıcıyla ilişkilendirme yapmaz.
// userPost.ts
export async function userPostProduct(
req: Request,
res: Response,
next: NextFunction
): Promise<void> {
try {
const userRepository: Repository<User> = getManager().getRepository(User);
const productRepository: Repository<Product> = getManager().getRepository(
Product
);
// Load user by id
const user = await userRepository.findOne(req.params.id);
const { ...data } = req.body;
const productToBeSaved = new Product();
productToBeSaved.name = data.name;
productToBeSaved.shortDescription = data.shortDescription;
productToBeSaved.longDescription = data.longDescription;
productToBeSaved.price = data.price;
productToBeSaved.category = data.category;
if (user) {
productToBeSaved.user = user;
}
// Validate product entity
const errors: ValidationError[] = await validate(productToBeSaved, {
skipMissingProperties: true
}); // Errors is and array of validation errors
if (errors.length > 0) {
// Return BAD REQUEST status code
return next(createError(400, errors));
} else {
let product = await productRepository.save(productToBeSaved);
// Return a CREATED status code and new product
res.status(201).send({
message: 'Product saved successfully',
product
});
}
} catch (err) {
// Return a BAD REQUEST status code and email already exists error
return next(createError(400, err));
}
}
Kullanıcı 1'in ürünlerini GET http://localhost:4000/users/1/products altında sorgulayamıyorum
Bunu da denedim:
// Build up entity product to be saved
const productToBeSaved = productRepository.create(req.body);
productToBeSaved.user = user;
if (user) {
user.products = [productToBeSaved];
await userRepository.save(user);
}
..ama şunu söyledi productToBeSaved, Product[] için eksik özellikler: id, name, category, vb...
Yani değiştirdim:
if (user) {
user.products = [...productToBeSaved];
await userRepository.save(user);
}
Sonra TypeError: productToBeSaved yineleyebilir değil dedi
Lütfen bana yardım edin, kullanıcıların ürün ilişkilerini nasıl oluşturabilirim.
Teknoloji yığını: TypeScript, Express, PostgreSQL, TypeORM
Gerçekten TypeORM kullanmak istiyorum, keşke daha iyi örnekleri olsaydı.