Linux安装Nodejs并访问数据库
- 下载Nodejs
- nodejs访问数据库
- nodejs部署到Web
- Nodejs定时器Promise
- Error: Cannot enqueue Handshake after invoking quit.
- Error: Cannot enqueue Query after invoking quit.
- 部署到nginx
下载Nodejs
Nodejs官网
1 | wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz |
解压
1 2 3 | tar -xvf node-v12.16.3-linux-x64.tar.xz #移动 mv node-v12.16.3-linux-x64 /usr/local/node |
建立软链接
1 | ln -s /usr/local/node/bin/node /usr/sbin/node |
1 | node -v |

安装成功!
参考自https://www.cnblogs.com/sirdong/p/11447739.html
nodejs访问数据库
新建工作目录
1 2 | mkdir $HOME/node cd $HOME/node |
安装驱动
1 | /usr/local/node/bin/npm install mysql |
新建all.js
1 | vim $HOME/node/all.js |
内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var mysql = require('mysql'); //创建连接 var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'root', port : '3306', database : 'database' }); //连接 connection.connect(); var sql = 'select * from table'; //开始查询 connection.query(sql,function(err,result){ if(err){ console.log('[select error] -',err.message); return; } console.log(result); }); connection.end(); |
效果如下

nodejs部署到Web
对上面的代码稍作修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | var http=require('http'); var url = require('url'); var mysql = require('mysql'); //创建连接 var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'miao', port : '3306', database : 'book_library' }); //准备sql var sql = 'select * from book'; //创建服务器 server = http.createServer(function(request,response) { //解析请求,包括文件名 var pathname= url.parse(request.url).pathname; //console.log(pathname); if(pathname !="/all.js"){ //HTTP 状态码 404 : NOT FOUND //Content Type:text/plain response.writeHead(404,{'Content-Type': 'text/html'}); response.end("<p1>error</p1>"); return; } //HTTP 状态码 200 : OK //Content Type:text/plain response.writeHead(200,{'Content-Type': 'text/html'}); //向客户端输出 //开始查询 connection.query(sql,function(err,result){ if(err){ console.log('[select error] -',err.message); return; } //console.log(result); response.write( '<!DOCTYPE html>'+ '<html lang="en">'+ '<head>'+ '<meta charset="utf-8"/>'+ '</head>'); response.write("这个是Nodejs实现的页面"); //打印表头 response.write("<table border='1'><tr>"); response.write("<th>书号</th>"); response.write("<th>书名</th>"); response.write("<th>作者</th>"); response.write("<th>出版社</th>"); response.write("<th>价格</th></tr>"); //遍历结果集输出 result.forEach(r =>{ response.write("<tr>"); response.write("<td>"+r.book_id+"</td>"); response.write("<td>"+r.title+"</td>"); response.write("<td>"+r.author+"</td>"); response.write("<td>"+r.publisher+"</td>"); response.write("<td>"+r.price+"</td>"); response.write("</tr>"); }) //发送响应数据 response.end(); }); }); server.listen(9003); |
结果如下

注意的几点:
- connection.query是一个回调函数。在nodejs中,回调函数都是异步执行的。所以response.end()需要放在回调函数里面,不然就会出现write
after end的错误。- 不用自己手动建立数据库连接。由query隐式的连接数据库,它可以创建或者复用空闲的数据库连接。
- response.write输出到客户端的时候需要加载html头部,声明其字符集,不然会出现乱码。
Nodejs定时器Promise
promise中有一个then方法能确保在回调函数结束后执行
Error: Cannot enqueue Handshake after invoking quit.
https://www.cnblogs.com/zaifeng0108/p/7224991.html
Error: Cannot enqueue Query after invoking quit.
https://blog.csdn.net/qq_39045645/article/details/95726315
部署到nginx
利用nginx的反向代理
1 2 | 后台执行all.js node $HOME/node/all.js& |
修改nginx配置文件,添加如下片段,即可通过nginx的端口访问到
1 2 3 4 5 | location ~/all.js$ { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:9003; } |