前段时间做的项目中使用了express+mysql。看一下我原来的实现代码:varconn=mysql.createConnection({host:'example.org',user:'bob',password:'secret',database:'my_db',port:'3306'});conn.connect();没问题,可以连接数据库,本地测试正常。最后把项目放到服务器上导致API请求超时,一直报504错误。我也很纳闷,为什么是504,我在服务器上用pm2守护node进程。最后查看了pm2的日志,发现报错了。不知道问题出在哪里,Nginx配置?pm2配置?自己的代码问题?最后分析了pm2的日志,发现是异常处理不当。检查后发现,当连接在一定时间内没有活动时,会自动关闭与数据库的连接。因为mysql连接断开了,我没有做异常处理,导致错误的代码继续运行,导致node进程没有结束,所以node进程没问题,但是连接不上数据库,服务会重启服务后恢复正常。在那之后,问题可能会再次出现。好了,接下来对代码做异常处理:functionhandleError(err){if(err){//如果连接异常,自动重连console.log('errcode:'+err.code);if(err.code==='PROTOCOL_CONNECTION_LOST'||err.code==='PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'||err.code==='ETIMEDOUT'){connect();}else{console.error(err.stack||err);}}}functionconnect(){conn=mysql.createConnection(models.mysql);conn.connect(handleError);conn.on('error',handleError);}varconn;connect();再写一个接口:router.use('/addUser',(req,res)=>{varsql='insertintouser_info(user_name,user_pwd)values(?,?)';varparams=req.body;console.log(params);conn.query(sql,[params.username,params.pwd],function(err,result){if(err){console.log(err);connect();}if(result){jsonWrite(res,结果);}})});就开心的放到网上,没问题,可是第二天起来,界面又是504,响应超时。[强忍着委屈的眼泪]好吧,那我们继续看看哪里有问题。参考这个文档:https://github.com/mysqljs/mysql继续改代码:varjsonWrite=function(res,ret){if(typeofret==='undefined'){res.json({代码:'1',消息:'操作失败'});}else{res.json(ret);}};varmysql=require('mysql');varpool=mysql.createPool({主机:'example.org',用户:'bob',密码:'secret',数据库:'my_db',端口:'3306'});varsql='insertintouser_info(user_name,user_pwd)values(?,?)';varparams=req.body;控制台日志(参数);pool.query(sql,[params.username,params.pwd],function(error,results,fields){if(error)throwerror;if(results){控制台.log(results)jsonWrite(res,results);}});哈哈哈哈哈,使用连接池完美解决了。已经上线10多天没有任何问题。我也是用pm2守护node进程,附上我的pm2配置:{"name":"index","cwd":"/usr/share/nginx/html/server","script":"index.js","max_memory_restart":"35M","cron_restart":"10***","watch":true,"exec_interpreter":"node","exec_mode":"fork","autorestart":true,"env":{"NODE_ENV":"production"}}哪里不对,望拍砖。希望指教。附上我的Vue项目:Vue全家桶+Express实现博客(所有后台API都是自己手写的,非常适合刚学vue和express的小伙伴)
