Vendure电商系统独立脚本开发指南
概述
在Vendure电商系统中,开发者经常需要执行一些独立于主应用之外的任务,比如数据导入导出、定时任务、批量处理等。本文将详细介绍如何使用Vendure提供的工具来创建和运行这些独立脚本。
为什么需要独立脚本
独立脚本在电商系统中扮演着重要角色,它们通常用于:
- 执行一次性数据迁移任务
- 运行定时批处理作业
- 进行系统维护操作
- 执行自动化测试
- 处理大数据量操作
核心概念:bootstrapWorker
Vendure提供了bootstrapWorker
函数,它允许开发者启动一个轻量级的Worker实例,这个实例包含了完整的服务层功能,但没有API层的额外开销。
基本用法示例
下面是一个获取产品数量的简单脚本:
import { bootstrapWorker, Logger, ProductService, RequestContextService } from '@vendure/core';
import { config } from './vendure-config';
if (require.main === module) {
getProductCount()
.then(() => process.exit(0))
.catch(err => {
Logger.error(err);
process.exit(1);
});
}
async function getProductCount() {
const { app } = await bootstrapWorker(config);
const productService = app.get(ProductService);
const ctx = await app.get(RequestContextService).create({
apiType: 'admin',
});
const { totalItems } = await productService.findAll(ctx, {take: 0});
Logger.info(
[
'\n-----------------------------',
`当前数据库中共有 ${totalItems} 个产品`,
'------------------------------',
].join('\n'),
)
}
关键组件详解
1. 应用上下文(app对象)
bootstrapWorker
返回的app
对象是NestJS应用上下文的实例,它提供了完整的依赖注入容器功能。通过这个对象,你可以获取Vendure核心或任何插件中定义的服务。
const customerService = app.get(CustomerService);
const orderService = app.get(OrderService);
2. 请求上下文(RequestContext)
Vendure的大多数服务方法都需要RequestContext
作为第一个参数。在独立脚本中,我们需要手动创建这个上下文:
const ctx = await app.get(RequestContextService).create({
apiType: 'admin', // 或 'shop'
});
创建上下文时,你可以指定:
- 上下文类型(admin/shop)
- 认证用户
- 语言代码
- 渠道信息
实际应用场景
数据导入脚本
async function importProducts() {
const { app } = await bootstrapWorker(config);
const productService = app.get(ProductService);
const ctx = await createAdminContext(app);
const products = await loadProductsFromCSV();
for (const productData of products) {
await productService.create(ctx, productData);
}
}
定时任务
async function sendAbandonedCartEmails() {
const { app } = await bootstrapWorker(config);
const orderService = app.get(OrderService);
const emailService = app.get(EmailService);
const ctx = await createShopContext(app);
const abandonedCarts = await orderService.findAbandonedCarts(ctx);
for (const cart of abandonedCarts) {
await emailService.sendAbandonedCartEmail(ctx, cart);
}
}
最佳实践
- 错误处理:确保捕获并适当处理所有可能的错误
- 日志记录:使用Vendure的Logger服务而不是console.log
- 资源释放:脚本结束时正确关闭数据库连接等资源
- 性能考虑:大数据量操作时使用分页或批量处理
- 配置管理:与主应用共享相同的配置
调试与运行
运行独立脚本有多种方式:
# 使用ts-node直接运行
npx ts-node src/scripts/my-script.ts
# 编译后运行
npm run build
node dist/scripts/my-script.js
总结
Vendure的独立脚本功能为开发者提供了强大的工具来扩展系统功能,执行后台任务。通过合理利用bootstrapWorker
和NestJS的依赖注入系统,你可以轻松构建各种自动化脚本,而无需启动完整的API服务。
记住,独立脚本虽然强大,但也需要谨慎使用,特别是在生产环境中操作关键数据时。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考