express+node的项目,我想在登陆的时候做切换config.js的操作,怎么实现?
可以使用 app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行 调用,示例代码如下:
const express = require("express");
const app = express();
//定义第一个全局中间件
app.use((res, req, next) => {
console.log("这是第一个全局中间件");
next();
})
//定义第二个全局中间件
app.use((res, req, next) => {
console.log("这是第二个全局中间件");
next();
})
//定义一个路由
app.get('/', (req, res) => {
res.send('User page!')
})
app.listen(80, () => {
console.log('listen on port');
})
我的解决方案:
针对此问题,可以实现一个自定义的中间件来读取config.js文件中的配置信息,然后根据读取的配置信息来加载不同的配置。
首先,在项目根目录下新建一个config文件夹,将不同环境下的配置文件放在该文件夹中,例如:config.development.js、config.production.js。
然后,在根目录下新建一个middleware文件夹,在该文件夹中新建一个loadConfig.js文件,编写自定义中间件,代码如下所示:
const path = require('path');
const fs = require('fs');
module.exports = function (req, res, next) {
const target = process.env.NODE_ENV || 'development';
const configPath = path.join(__dirname, '../config', `config.${target}.js`);
// 读取配置文件
fs.readFile(configPath, 'utf8', (err, data) => {
if (err) throw err;
// 将读取到的配置信息转换成对象
const config = JSON.parse(data);
// 将配置信息挂载到请求对象中
req.config = config;
next();
});
}
然后,在app.js(或者index.js)中注册中间件:
const loadConfig = require('./middleware/loadConfig');
// 注册自定义中间件
app.use(loadConfig);
// 在路由中使用config(读取config.js中的配置信息)
app.get('/', (req, res) => {
console.log('当前环境:', process.env.NODE_ENV);
console.log('读取到的配置信息:', req.config);
res.send('Hello World');
});
最后,在package.json中添加一个启动命令:
"scripts": {
"start": "NODE_ENV=development node app.js"
}
这样,在主函数中就可以通过process.env.NODE_ENV来实现自动切换config文件,同时,使用自定义中间件来读取不同的配置文件。在路由中就可以根据读取到的配置信息来加载不同的配置。