问题:测试环境和生产环境不是同样的数据库或者配置不一样,那么上线的时候总不能改代码吧?那么如果实现一键部署呢?
实现: 那么我就来快速搭建并且测试一下,步骤如下。 1、你已经成功安装了node。 2、快速搭建一个项目:使用express的应用程序生成器npx express-generator。具体实现如下:https://www.expressjs.com.cn/en/starter/generator.html 按照上个链接创建项目,使用npm start命令正常启动,通过浏览器访问http://localhost:3000/就可以检测是否成功启动。 看代码: 其实我们可以看到这个demo已经区分了生产或者测试的启动端口设置了,见bin/www的文件,部分代码如下:
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
扩展:如果我在不改代码的情况下,想使用8083端口启动,怎么办?
set PORT=8083 & npm start
结果如下:
3、代码中区分环境。
第2步的例子只是可以区分端口,但是如果想区分数据库或者redis的连接,上面的步骤是远远不够的。那么如果能实现零配置进行启动呢?
最简单的想法:弄一个配置文件,在发布之前修改配置文件是测试还是生产。但是注意,只要是需要人工干预的,都是有可能出现问题的,那就是会忘记…
我们可以使用以下办法,让其动态实现:
1、在根目录创建config目录,以下(1)(2)(3)步都是存在于config目录下
(1)创建测试或者开发环境的development.js类
module.exports={
sql:{
sqlServer: 'TestServer',
sqlDatabase:'TestDatabase',
salUser:'testUser',
sqlPwd:'testPwd'
}
}
(2)创建生产环境的production.js类
module.exports={
sql:{
sqlServer: 'ProdServer',
sqlDatabase:'ProdDatabase',
salUser:'ProdUser',
sqlPwd:'ProdPwd'
}
}
(3)创建动态读取的类choise.js
var path=require('path')
//通过NODE_ENV来设置环境变量,如果木有指定则默认为生产环境
var env=process.env.NODE_ENV || 'production';
env=env.toLowerCase();
//载入配置文件
var file=path.resolve(__dirname,env);
try {
module.exports=require(file)
} catch (error) {
throw error;
}
(4)引入环境代码 在route/index.js文件中,新增choise.js的引入,并且打印和返回最终获取的环境信息,最终代码如下:
var express = require('express');
var router = express.Router();
var choise=require('../config/choise.js')
/* GET home page. */
router.get('/', function(req, res, next) {
console.log(choise.sql)
res.render('index', { title: choise.sql.sqlServer });
});
module.exports = router;
(5)进行测试,创建production.bat文件,此bat文件是window环境的,直接在文件夹目录找到此文件,双击即可启动
set NODE_ENV=production
set PORT=8083
npm start
(6)查看结果,结果图如下
(7)以上就是结果,如果你要创建开发或者测试环境的,按照第(5)步一样的形式就行了,比如我创建了development.bat,代码如下:—没有设置端口,但是因为www文件中,如果没有设置默认是3000
set NODE_ENV=development
npm start
那么结果图如下:
以上就是搭建并测试了一个区分环境的步骤,如有疑问可留言哦~~~