Slog1_如何使用nodejs与mysql进行数据交互

  • ArthurSlog

  • SLog-1

  • Year·1

  • Guangzhou·China

  • July 6th 2018


    icon_128.jpg

没有人能阻挡我前进的道路

安装nodejs作为开发服务器的工具(macOS)

  • 打开终端,切换至Desktop路径

cd Desktop

  • 新建一个文件夹“nodejs_learningload”

mkdir nodejs_learningload

  • 切换至nodejs_learningload路径

cd nodejs_learningload

  • 现在开始安装nodejs了:
  • 使用homebrow这个工具来协助我们

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  • 根据命令行提示继续操作,完成homebrew的下载和安装(下载、安装可能需要一些时间),然后使用brew安装nodejs

brew install node

  • 检查node是否完整安装

node -v

v10.6.0

npm -v

6.1.0

  • 至此nodejs完整安装完成

安装Mysql,配置Mysql

  • 使用brew安装mysql

brew install mysql

  • 启动mysql,检查mysql是否完整安装

mysql.server start

  • Starting MySQL
  • .SUCCESS!
  • 配置Mysql,设置root账户的密码为8个8

mysqladmin -u root password 88888888

  • 登陆数据库

mysql -u root -p

  • 输入密码,再按enter键,命令行会变成以下状态

mysql>

  • 输入SQL命令,按enter键执行,列出已有的数据库

mysql> show databases;

Database
information_schema
mysql
performance_schema
sys

4 rows in set(0.01 sec)

  • 我们创建一个数据库"my_db"

mysql> create database my_db;

Query OK, 1 row affected (0.02 sec)

  • 进入my_db数据库

mysql> use my_db;

Database changed

  • 我们创建一个表“Account"
mysql> CREATE TABLE Account
(
ID int NOT NULL AUTO_INCREMENT,
AccountName varchar(255) NOT NULL,
Password varchar(255) NOT NULL,
PRIMARY KEY (ID)
);

Query OK, 0 rows affected (0.09 sec)

  • 向Account表里插入一行数据
mysql> INSERT INTO Account (AccountName, Password)
VALUES ('ArthurSlog','ArthurSlog);

Query OK, 1 row affected (0.08 sec)

  • 查看一下Account表

mysql> SELECT * FROM Account;

ID AccountName Password
1 KingArthur KingArthur

1 row in set (0.00 sec)

  • 退出mysql交互模式

exit;

Bye

实现nodejs和Mysql的数据交互

  • 切换当前路径至~/Desktop/nodejs_learningload

cd ~/Desktop/nodejs_learningload

  • 使用npm,执行npm命令初始化环境

npm init

  • 一路默认enter就行,再当前路径下生成一个package.json文件
  • 使用npm,执行npm命令安装express模块

sudo npm install express

  • 接下来,开始编写逻辑代码
  • 一共要写两个个文件,index.html、index.js
  • index.html: 主页
  • index.js: web服务器,提供web服务和路由功能,其中还有最为关键的函数(路由),可以连接数据库,执行SQL命令的函数

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SingUp</title>
</head>
<body>
    <p>Sing up</p>
    <form action="http://127.0.0.1:8081/singupAccount" method="GET">
        Name: <input type="text" name="name"> 
        <br>
        Password: <input type="text" name="password">
        <br>
        <input type="submit" value="注册">
    </form>
    <br>
</body>
</html>
  • 其中,关键的地方在这个位置
    <form action="http://127.0.0.1:8081/singupAccount" method="GET">
        Name: <input type="text" name="name"> 
        <br>
        Password: <input type="text" name="password">
        <br>
        <input type="submit" value="注册">
    </form>
  • 这里使用<from></from>标签
action="http://127.0.0.1:8081/singupAccount" method="GET"
  • 仔细看这里
action="http://127.0.0.1:8081/singupAccount"
  • express的路由功能在这里体现
/singupAccount
  • 这个路由(方法)/singupAccount,我们将会在另一个文件(index.js)里编写好,以供前端调用

index.js

var express = require('express');
var fs = require("fs");
var app = express();
 
app.use(express.static(__dirname));

app.get('/singupAccount', function (req, res) {
 
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : '88888888',
      database : 'my_db'
    });
     
    connection.connect();

    var response = {
        "name":req.query.name,
        "password":req.query.password
    };

    var  addSql = 'INSERT INTO Account(AccountName, Password) VALUES(?,?)';
    var  addSqlParams = [response.name, response.password];

    connection.query(addSql,addSqlParams,function (err, result) {
        if(err){
            console.log('[INSERT ERROR] - ',err.message);
            res.send('执行sql出错!');
            return;
        }
        res.send('Welcome~ SingUp Success ^_^');
    });

    connection.end();
 })

var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
  • 在index.js里面,使用express模块的静态路由功能,路由的是我们的主页

  • 静态路由,程序一启动就会执行静态路由的方法,这个方法就是打开我门的主页

var express = require('express');

var app = express();
 
app.use(express.static(__dirname));
  • 使用express的web服务器功能,实现了一个web服务器,ip:127.0.0.1:8081
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
}
  • 最关键的地方在下面这里,实现了一个路由(方法),当前端路由到这个方法的时候,让程序连接mysql数据库,并向mysql数据库里添加数据
app.get('/singupAccount', function (req, res) {
 
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : '88888888',
      database : 'my_db'
    });
     
    connection.connect();

    var response = {
        "name":req.query.name,
        "password":req.query.password
    };

    var  addSql = 'INSERT INTO Account(AccountName, Password) VALUES(?,?)';
    var  addSqlParams = [response.name, response.password];

    connection.query(addSql,addSqlParams,function (err, result) {
        if(err){
            console.log('[INSERT ERROR] - ',err.message);
            res.send('执行sql出错!');
            return;
        }
        res.send('Welcome~ SingUp Success ^_^');
    });

    connection.end();
 })
  • /singupAccount这个路由(方法)是关键,首先,在方法里面需要先配置mysql连接参数
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : '88888888',
      database : 'my_db'
    });
  • 连接参数配置好后,连接mysql数据库
connection.connect();
  • 成功连接上mysql数据库了,前端的数据会先传递给路由(方法)/singupAccount
  • 这个时候前端的数据是保存在全局变量req.query里面的,一共有两个值“name”和“password”
req.query.name
req.query.password
  • 此时,声明一个变量response用来保存这两个前端传过来的值
    var response = {
        "name":req.query.name,
        "password":req.query.password
    };
  • OK,现在需要做最后一步了,让Mysql执行SQL命令,把前端的传过来的数据正确的插入数据库里
    var  addSql = 'INSERT INTO Account(AccountName, Password) VALUES(?,?)';
    var  addSqlParams = [response.name, response.password];

    connection.query(addSql,addSqlParams,function (err, result) {
        if(err){
            console.log('[INSERT ERROR] - ',err.message);
            res.send('执行sql出错!');
            return;
        }
        res.send('Welcome~ SingUp Success ^_^');
    });
  • 执行完SQL命令后,断开与数据库的连接
connection.end();

最终测试

  • 首先打开终端,并打开mysql数据库,查看Account表里的内容
mysql -u root -p
Enter password:

mysql>
mysql> use my_db;
Database changed
mysql> select * from Account;

ID  AccountName Password
1   KingArthur  KingArthur
1 row in set (0.00 sec)
mysql> 
  • 再打开一个新的终端,切换当前路径至~/Desktop/nodejs_learningload,执行index.js文件,启动web服务器

node index.js

  • 打开浏览器,键入地址127.0.0.1:8081,打开主页
  • 键入“Name”值“KingArthur2”,键入“Password”值“KingArthur2”,然后点击提交
  • 页面跳转,并显示“Welcome~ SingUp Success _
  • 此时,调出另一终端,查看数据库里的Account表
  • mysql> select * from Account;

ID  AccountName Password
1   KingArthur  KingArthur
2   KingArthur2 KingArthur2
2 row in set (0.00 sec)
  • 至此,nodejs与mysql成功进行了数据交互。

欢迎关注我的微信公众号 ArthurSlog

icon_128.jpg

如果你喜欢我的文章 欢迎点赞 留言

谢谢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容