[笔记]web前端开发之Node.js(1):与mysql的交互

本文由清尘发表于2021-05-25 08:14最后修改于2021-06-01属于Node.js分类

相关链接:
[笔记]web前端开发之Node.js(1):与mysql的交互
[笔记]web前端开发之Node.js(2):Node.js和express构建网站
[笔记]web前端开发之Node.js(3):Node.js和Express实现上传文件功能

Node.js中的全局变量

1.Node.js的全局对象就是在程序的任何地方都可以访问的变量
2.Javascript的全局对象一般为Window对象,而Node中的全局对象是global
3.所有全局变量都是global对象的属性
4.在Node.js我们可以直接访问到global属性
5.建议永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险

常用全局变量

__filename:表示当前正在执行脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。如果在模块中,返回的值是模块文件的路径。

__dirname:当前脚本所在执行目录

setTimeout(cb,ms):指定时间后再执行函数,只执行一次

clearTimeout(t):停止setTimeout操作

setInterval(cb,ms):反复执行函数,可以使用clearInterval停止执行

console:控制台的标准输出 log,info

Node.js创建服务器代码

var http = require('http');

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/plain'});

  response.write("hello worle");
  response.end();

}).listen(8888);

console.log('Server running at http://127.0.0.1:8888');

Node.js服务器监听操作

服务器的监听操作

在Node.js中events是比较重要的模块,events模块只提供了一个对象events.EventEmitter,EventEmitter的核心是事件发射与事件监听器
在Node.js中大部分的模块,都继承自Event模块
EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

emitter.on(event,listener):监听注册(服务器端的监听操作)
emitter.emit(event,arg1…):监听触发
emitter.once(event,listener):单次监听
emitter.removeListener/emitter.removeAllListeners:移除监听/移除所有监听
emitter.listeners:监听数组的返回
emitter.setMaxListeners:设置监听器的最大值

//引入事件监听类
var EventEmitter = require("events").EventEmitter;
//创建事件监听对象
var ee = new EventEmitter();

/**
 * 事件的注册
 */

ee.on("some_events",function(foo,bar){
  console.log("第一个监听事件,参数foo="+foo+",bar="+bar);
})

console.log("第一轮");
//事件触发
ee.emit("some_events","wilson","zhong");

console.log("第二轮");
ee.emit("some_events","wilson","Z");

Node.js框架与数据库

简介与安装

在Node.js与MySQL交互操作有很多库,具体可以在https://www.npmjs.com/search?q=mysql查看
这里选择了felixge/node-mysql
地址:https://www.npmjs.com/package/mysql
https://github.com/mysqljs/mysql

安装

npm install mysql 

注意:安装前先把目录cd到node项目所在目录下,这样执行安装命令时,会找到目录下node_modules,并安装在此目录下,否则使用mysql时,你会出现Error:Cannot find module ‘mysql’

测试mysql

创建一个数据库nodesample
创建一个表userinfo

CREATE DATABASE IF NOT EXISTS nodesample CHARACTER SET UTF8; USE nodesample; SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `userinfo`; CREATE TABLE `userinfo` (`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `UserName` varchar(64) NOT NULL COMMENT '用户名', `UserPass` varchar(64) NOT NULL COMMENT '用户密码', PRIMARY KEY (`Id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
var mysql = require('mysql');

var connection = mysql.createConnection({
  host:"localhost",
  user:"root",
  password:"",
  port:"3306"
});

connection.connect(function(err){
  if(err){
    console.log('[query]-:'+err);
    return;
  }
  console.log("[connection connect] succeed!");
})

//执行语句
connection.query("SELECT 1+1 as solution",function(err,rows,fields){
  if(err){
    console.log('[query] - :' + err);
    return;
  }
  console.log('The solution is:',rows[0].solution);
})

//关闭动作
connection.end(function(err){
  if(err){
    return;
  }
  console.log('[connection end] succeed!');
})

数据库CURD操作

插入数据

var mysql = require('mysql');

var connection = mysql.createConnection({
  host:"localhost",
  user:"root",
  password:"",
  port:"3306",
  database:'nodesample'
});

//创建链接
connection.connect();

//制定语句
var userAddSql = "INSERT INTO userinfo(Id,Username,UserPass) VALUES(0,?,?)";
var userAddSql_Params = ['Wilson','abcd'];
//增
connection.query(userAddSql,userAddSql_Params,function(err,result){
  if(err){
    console.log('[INSERT ERROR] -:',err.message);
    return;
  }
  console.log("-----------INSERT------------");
  console.log("INSERT ID:",result);
})

//关闭链接
connection.end();

修改数据

var mysql = require('mysql');

var connection = mysql.createConnection({
  host:"localhost",
  user:"root",
  password:"",
  port:"3306",
  database:'nodesample'
});

//创建链接
connection.connect();

//制定语句
var userAddSql = "UPDATE userinfo SET UserName=?,UserPass=? WHERE Id=?";
var userAddSql_Params = ['new name','5678',1];
//改
connection.query(userAddSql,userAddSql_Params,function(err,result){
  if(err){
    console.log('[UPDATE ERROR] -:',err.message);
    return;
  }
  console.log("-----------UPDATE------------");
  console.log("UPDATE affectedRows:",result.affectedRows);
})

//关闭链接
connection.end();

查找数据

var mysql = require('mysql');

var connection = mysql.createConnection({
  host:"localhost",
  user:"root",
  password:"",
  port:"3306",
  database:'nodesample'
});

//创建链接
connection.connect();

//制定语句
var userGetSql = "SELECT * FROM userinfo";

//查
connection.query(userGetSql, function (err, result) {
  if (err) {
    console.log("[SELECT ERROR] -:", err.message);
    return;
  }
  console.log("-----------SELECT------------");
  console.log(result);
});

//关闭链接
connection.end();

删除数据

var mysql = require('mysql');

var connection = mysql.createConnection({
  host:"localhost",
  user:"root",
  password:"",
  port:"3306",
  database:'nodesample'
});

//创建链接
connection.connect();

//制定语句
var userDelSql = "DELETE FROM userinfo";

//删
connection.query(userDelSql, function (err, result) {
  if (err) {
    console.log("[DELETE ERROR] -:", err.message);
    return;
  }
  console.log("-----------DELETE------------");
  console.log("DELETE affectedRows", result.affectedRows);
});

//关闭链接
connection.end();

Node.js连接池应用

Pooling connections
释放连接池 connection.release()

var mysql = require('mysql');

//创建连接池
var pool = mysql.createPool({
  host:"localhost",
  user:"root",
  password:"",
  port:'3306',
  database:'nodesample'
});

//链接池也可以直接操作数据(SQL)语句 不推荐
// pool.query("SELECT 1+1 as solution", function (err, rows, fields) {
//   if (err) {
//     console.log("[query] - :" + err);
//     return;
//   }
//   console.log("The solution is:", rows[0].solution);
// });

//共享连接语句
pool.getConnection(function(err,connection){
  connection.query("SELECT * FROM userinfo",function(err,result){
    console.log(result);
    // connection.release(); // 释放连接池
  });

  connection.query("SELECT * FROM userinfo", function (err, result) {
    console.log(result);
    connection.release(); // 释放连接池
  });

})