LoopBack4多数据源配置:如何让Content连MongoDB、User连MySQL
嘿,这个需求在LoopBack4里实现起来思路很清晰,我给你一步步拆解怎么做~
一、配置
datasource.json 多数据源 LoopBack4原生支持多数据源,你只需要在项目根目录的 src/datasources/datasources.json 文件里定义两个数据源配置,分别对应MongoDB和MySQL就行。
先看示例配置:
{ "mongoDb": { "name": "mongoDb", "connector": "mongodb", "url": "mongodb://localhost:27017/your_mongo_db_name", "useNewUrlParser": true, "useUnifiedTopology": true }, "mySqlDb": { "name": "mySqlDb", "connector": "mysql2", "host": "localhost", "port": 3306, "user": "your_mysql_user", "password": "your_mysql_password", "database": "your_mysql_db_name" } }
关键参数说明:
name:自定义的数据源标识,后面模型关联时要用到,比如这里的mongoDb和mySqlDbconnector:必须对应数据库类型:- MongoDB用
mongodb(需要先安装loopback-connector-mongodb包) - MySQL推荐用
mysql2(安装loopback-connector-mysql2,比旧的mysql连接器更稳定)
- MongoDB用
- 连接参数:
- MongoDB可以直接用
url指定完整连接字符串,包含地址、端口和数据库名 - MySQL需要单独填写
host、port、数据库用户名、密码和目标数据库名
- MongoDB可以直接用
别忘了先安装依赖包:
npm install loopback-connector-mongodb loopback-connector-mysql2
二、让模型关联对应数据源
LoopBack4里是通过**Repository(仓库)**来绑定模型和数据源的,所以我们需要给Content和User分别创建对应的Repository,并关联到各自的数据源。
1. Content 模型关联 MongoDB
首先生成Content模型(可以用lb4 model命令快速生成),然后创建对应的Repository:
Content 模型示例:
import {Entity, model, property} from '@loopback/repository'; @model() export class Content extends Entity { @property({ type: 'string', id: true, generated: true, mongodb: {dataType: 'ObjectID'} // 适配MongoDB的ObjectID类型 }) id?: string; @property({ type: 'string', required: true, }) title: string; // 按需添加其他属性,比如contentBody、createdAt等 constructor(data?: Partial<Content>) { super(data); } } export interface ContentRelations {} export type ContentWithRelations = Content & ContentRelations;
ContentRepository 绑定 MongoDB 数据源:
import {DefaultCrudRepository} from '@loopback/repository'; import {Content, ContentRelations} from '../models'; import {MongoDbDataSource} from '../datasources'; import {inject} from '@loopback/core'; export class ContentRepository extends DefaultCrudRepository< Content, typeof Content.prototype.id, ContentRelations > { constructor( // 注入我们在datasource.json里定义的mongoDb数据源 @inject('datasources.mongoDb') dataSource: MongoDbDataSource, ) { super(Content, dataSource); } }
2. User 模型关联 MySQL
同样的步骤,先生成User模型,再创建关联MySQL的Repository:
User 模型示例:
import {Entity, model, property} from '@loopback/repository'; @model() export class User extends Entity { @property({ type: 'number', id: true, generated: true, // 适配MySQL的自增ID }) id?: number; @property({ type: 'string', required: true, unique: true, }) email: string; // 按需添加其他属性,比如username、passwordHash等 constructor(data?: Partial<User>) { super(data); } } export interface UserRelations {} export type UserWithRelations = User & UserRelations;
UserRepository 绑定 MySQL 数据源:
import {DefaultCrudRepository} from '@loopback/repository'; import {User, UserRelations} from '../models'; import {MySqlDbDataSource} from '../datasources'; import {inject} from '@loopback/core'; export class UserRepository extends DefaultCrudRepository< User, typeof User.prototype.id, UserRelations > { constructor( // 注入mySqlDb数据源 @inject('datasources.mySqlDb') dataSource: MySqlDbDataSource, ) { super(User, dataSource); } }
三、验证配置是否生效
你可以快速写两个测试Controller来验证:
比如ContentController:
import {post, requestBody} from '@loopback/rest'; import {ContentRepository} from '../repositories'; import {inject} from '@loopback/core'; import {Content} from '../models'; export class ContentController { constructor( @inject('repositories.ContentRepository') public contentRepository: ContentRepository, ) {} @post('/contents') async create(@requestBody() content: Content): Promise<Content> { return this.contentRepository.create(content); } }
再写一个类似的UserController,然后启动项目(npm start),调用POST /contents和POST /users接口,分别检查MongoDB和MySQL数据库,看数据是否正确写入对应的库中。
额外小贴士
- 确保MongoDB和MySQL服务已经启动,并且连接参数里的数据库已经提前创建好
- 生产环境建议用环境变量来配置敏感信息(比如密码),可以在
datasources.json里用${VAR_NAME}的方式引用,比如:"mySqlDb": { "host": "${MYSQL_HOST}", "password": "${MYSQL_PASSWORD}" } - 如果遇到连接问题,先检查端口是否开放、用户名密码是否正确,以及连接器包的版本是否和你的LoopBack4版本兼容
内容的提问来源于stack exchange,提问作者Polly Pairot
相关产品推荐
相关产品推荐

