Linux安装Nodejs并访问数据库

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);

结果如下
在这里插入图片描述

注意的几点:

  1. connection.query是一个回调函数。在nodejs中,回调函数都是异步执行的。所以response.end()需要放在回调函数里面,不然就会出现write
    after end
    的错误。
  2. 不用自己手动建立数据库连接。由query隐式的连接数据库,它可以创建或者复用空闲的数据库连接。
  3. 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;
}