我的方案id是一个nodejs+express的应用,连接到一个mysql数据库。
有一些上下文配置,对所有网站和所有用户都有效,我需要在每次页面请求时从数据库中加载(不是在应用初始化时,因为我不想在配置改变时重新加载整个服务器)。
我的想法是使用一个简单的中间件将上下文注入到请求中,就像这样。
const express = require('express');
const contextSetup = require('./contextSetup');
const app = express();
...
app.use(contextSetup.middleWare);
...
而在 contextSetup.js
:
const DB = require('./DB');
module.exports.middleWare = (req, res, next) => {
DB.query('select `code`, `data` from `setting` order by `sort`')
.then((rows) => {
const keyVals = {};
rows.forEach((row) => {
keyVals[row.code] = row.data;
});
req.appContext = keyVals;
next();
})
.catch((err) => next(err));
};
唯一的警告是在使用中间件后 app.use(express.static());
否则我的中间件会被调用,即使是静态文件的请求(图片,css,js,...)。
这种方法正确吗?
谅谅
这在我的书中是可行的! 我可能会建议你把这个放在路由器上,所以这只对登录的用户有效,例如。你也可以进一步隔离你的路由器,这样如果有任何ajax路由,这些值就不会被请求而被忽略。所以代码看起来不错,如果性能成为一个问题,只需实现一个缓存,比如说,每半分钟或十次请求刷新一次。但它只有一个查询,所以目前看来还不错。