简体   繁体   English

使用 expressjs 和 prisma 根据请求源更改数据库

[英]change database based on request origin using expressjs & prisma

I want to change database dynamically based on request origin.我想根据请求来源动态更改数据库。

I create a globalMiddleware which is called on every routes.我创建了一个在每条路线上调用的 globalMiddleware。

 // middlwares/global.middleware.js import DBController from "../controllers/db.controller.js"; import { db1, db2 } from "../prisma/prismaClient.js"; export default (req, res, next) => { const dbcontroller = DBController(); const domain = req.get("origin"); switch (domain) { case "http://localhost:3000": dbcontroller.setDB(db1); break; case "http://localhost:3001": dbcontroller.setDB(db2); break; } next(); };

but when i set the db inside DBController by calling dbcontroller.setDB() method and finally calling this.DB it is undefined.但是当我通过调用dbcontroller.setDB()方法并最终调用 this.DB 在 DBController 中设置数据库时,它是未定义的。

 // controller/db.controller.js import autoBind from "auto-bind"; class DBController { constructor() { this.DB; autoBind(this); } setDB(prismaClient) { this.DB = prismaClient; } } export default DBController;

 // conrtoller/controller.js import { generateResponse } from "./../util/public.util.js"; import DBController from "./db.controller.js"; import autoBind from "auto-bind"; import createError from "http-errors"; class Controller extends DBController { constructor() { super(); this.generateResponse = generateResponse; this.createError = createError; autoBind(this); } } export default Controller;

 // controller/article.controller.js import Controller from "./controller.js"; class ArticleController extends Controller { async get(req, res, next) { try { const articles = await this.DB.article.findMany(); //this.DB is undefined const response = this.generateResponse("success", articles); res.send(response); } catch (error) { next(error); } } } export default new ArticleController();

I don't know how should i set a global DB inside a top-level controller which can be used every where.我不知道我应该如何在可以在任何地方使用的顶级 controller 中设置全局数据库。

I also try js global.db vars and express app.set("db",db1) but i think these are not a good solution for this work.我也尝试 js global.db vars 和 express app.set("db",db1) 但我认为这些不是这项工作的好解决方案。

finally I modify global.middleware.js file and modify request instead of setting database in a high-level controller :最后,我修改了global.middleware.js文件并修改request ,而不是在高级controller中设置数据库:

 import { prisma_aramgostar, prisma_karen } from "../prisma/prismaClient.js"; export default async(req, res, next) => { const domain = await req.get("x-forwarded-host"); switch (domain) { case "localhost:3000": req.DB = prisma_aramgostar; console.log("db: aramgostar"); break; case "127.0.0.1:3001": req.DB = prisma_karen; console.log("db: karen"); break; } next(); };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM