前言
很高兴我的node.js处女作开发完成了,目前还在优化完善阶段,经历两周的紧张沟通和开发,工作总算搞一段落。选用node.js 一是因为这次的业务逻辑相对来说简单想拿node练练手,二就是相对来说在处理高并发时比较有简单粗暴的优势,官方自己的话说处理百万级并发都很easy,这也是我跟解决方案经理吹牛的理由。
开发完几个问题
1、因为做项目的惯性,在连接数据库时就想分层,Dao或者Repository。那么在这次的node项目中我没有分层,因为连接是在app.js中打开并且通过中间件注入Express Request中,我不知道以什么方式把连接传入Dao层,当然也不太明确Dao层如何组织,也不太明确如何在路由.js文件中如何更好的调用Dao层。
2、如果生产部署的话肯定是需要绑定域名的,那么目前最简单的绑定方式和部署方式是什么?(已了解到使用nginx来部署,但还没实践,同时也可以处理并发负载)。
用到的技术和知识点
1、Express框架(4.x)。没什么可说的MVC框架,node.js官方推荐的框架,最起码你用reqeust,response顺手很多。
2、node.js连接Mysql。 在连接mysql时我用了一个插件express-myconnection,并且注册成中间件可以在每次请求的request那到connection,上一篇文章中总结过, 但随即我在评论中看到有人持反对态度,并且点了反对,他的理由是你做成中间件,那么每个路由请求中都会连接数据库。 随后我又查了官网和其他的一些资料,他们推荐是这样做的,并且解释到这样使用每个connection的生命周期也就是到response结束连接就会释放掉。
//app.js app.use( connection(mysql, { host: '127.0.0.1', user: 'root', password: '*****', port: '3306', database: 'db' }, 'pool') //选择资源池,系统自己release connection to poll ); //routes/order.js router.get('/cost', function(req, res, next) { req.getConnection(function(err, conn) { //处理你的数据逻辑 }); });
3、node.js 连接redis。连接redis直接使用createClient,使用不使用pool都可以。
var redis = require('redis'), client = redis.createClient(); //选择数据库 client.select('0',function(err){}) //判断key是否存在 client.exists(key, function(err, result) {}) //设置hash set值 client.hmset(key,[],function(err,result){}) //获取hash set值 client.hgetall(key, function(err, obj) {}) //获取key value值 client.get(key, function(err, result) {}); //设置key value client.set(key, opValue, function(err, result) {})
4、使用log4js。当然生产运行的接口程序少不了日志的运行。log4js还能配置发送邮件,但我没调通,仅仅是报错时看下log。
//做成json配置文件 { "appenders": [ { "type": "console", "category": "console" }, { "type": "dateFile", "filename": "d:/weblogs/logs/", "pattern": "yyyyMMddhh.txt", "absolute": true, "alwaysIncludePattern": true, "category": "logInfo" } ], "levels": { "logInfo": "DEBUG" } } //调用 var log4js = require('log4js'); log4js.configure('./log4js.json'); var logger = log4js.getLogger('logInfo'); //错误日志 logger.err('测试日志'); //info日志 logger.info('测试日志');