Linux安装Nodejs并访问数据库
下载Nodejs
wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz
解压
tar -xvf node-v12.16.3-linux-x64.tar.xz
#移动
mv node-v12.16.3-linux-x64 /usr/local/node
建立软链接
ln -s /usr/local/node/bin/node /usr/sbin/node
node -v
安装成功!
参考自https://www.cnblogs.com/sirdong/p/11447739.html
nodejs访问数据库
新建工作目录
mkdir $HOME/node
cd $HOME/node
安装驱动
/usr/local/node/bin/npm install mysql
新建all.js
vim $HOME/node/all.js
内容如下
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
对上面的代码稍作修改
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的反向代理
后台执行all.js
node $HOME/node/all.js&
修改nginx配置文件,添加如下片段,即可通过nginx的端口访问到
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;
}