В итоге я выбрал подход conn.changeUser () для достижения того, что я хочу.
Другой вариант: mysql .createPoolCluster () , который было немного сложно, так как я должен был знать базы данных заранее, а не делать это на лету.
Как это работает ...
- Создать основной пул в
server.js
.
// One main pool is created on app initialization
let pool = mysql.createPool(db);
// That pool is passed in the database middleware
// which forwards a connection to a corresponding database for further use
app.all("/api/*", middleware.databaseHandler(pool));
Извлечь соединение из пула в промежуточном программном обеспечении.
let databaseHandler = (pool) => {
return (req, res, next) => {
// req.decoded comes from authenticationHandler
let database = req.decoded.database;
// Get a connection from the main pool in app.js
pool.getConnection((err, conn) => {
if (err) {
console.log(err);
return;
}
// Change the database for the connection
conn.changeUser({ database: database }, function (err) {
if (err) {
console.log(err);
return;
}
// Promisify for Node.js async/await.
const query = util.promisify(conn.query).bind(conn);
// Pass the modified query method down the chain as a property of req, avaiable via next()
// connection.release() is called in the routes
req.query = query;
req.connection = conn;
next();
});
});
};
};
Используйте соединение в API и затем освободите его.
router.get("/api/products", async function (req, res, next) {
try {
let query = `select * from product;`;
var rows = await req.query(query);
res.status(200).send(rows);
} catch (err) {
next(err);
} finally {
req.connection.release();
}
});
Кажется, все работает хорошо, если кто-то обнаружит проблему, ответьте.