初识NodeJS服务端开发之NodeJS+Express+MySQL

2018-06-08 15:04:07 浏览数 (1)

前言 我的天呐,上了一个上午的课,下午呆呆地在图书馆用python玩并发,晚上就玩玩NodeJS,其实是这样的,O(∩_∩)O哈哈~听说14周NodeJS要结课了,我今天就琢磨琢磨了一下NodeJS的开发框架以及熟悉了Express框架的基本环境。... ... 对express框架稍微扩展之后呢,okay之后,我感觉回到了之前写PHP的small-frame似的,结构目录看起来的感觉很熟悉,NodeJS与PHP果然是两兄弟。额额,主要是熟悉Express框架,好了,具体我要回忆我的晚上做了什么喽。


nodeJS是什么 nodeJS是基于Javascript和Google的V8引擎的一种运行于服务端的一门编程语言,与PHP相比,nodeJS的运行速度以及性能都是想当不错的。


nodeJS的安装 一切都在Ubuntu下运作... ... 对此不解释,只留步骤O(∩_∩)O哈哈 在官网下载系统对应版本的tar.xz后,Look

代码语言:javascript复制
➜  ~ sudo mkdir /env
➜  ~sudo mv ./node-v6.10.0-linux-x86.tar.xz  /env/
➜  ~cd /env
➜  ~sudo xz node-v6.10.0-linux-x86.tar.xz
➜  ~ sudo tar -xvf node-v6.10.0-linux-x86.tar && sudo rm node-v6.10.0-linux-x86.tar
➜  ~ sudo mv node-v6.10.0-linux-x86 node-v6.10.0

配置环境,编辑/etc/profile文件添加如下的环境信息

代码语言:javascript复制
#NodeJS
export NODE_HOME=/env/node-6.10.0
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_module

来看看是否安装成功了呢

代码语言:javascript复制
➜  ~ node -v
v6.10.0
➜  ~ npm -v
1.3.10
➜  ~ 

(⊙o⊙)嗯。至此,安装完成! 好了,上面的都是吹水的,初识Express开发框架环境才是重点,接下来... ...


Express简介 Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。它具有丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单。并且Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。

接下来得又是安装,安装express方式有很多种,如下使用npm安装,不解释... ...

  • 安装express
代码语言:javascript复制
➜  ~ sudo npm install express express-generator -g
# 安装过程省略 ... ...
➜  ~ express --version
4.14.1

okay了,我们开始只用express初始化一份工程demoProject

  • 使用express命令初始化demoProject项目
代码语言:javascript复制
➜  ~ express demoProject

额额,通过上面的命令已经初始化了一份工程,具体来分析分析工程的目录结构

  • demoProject目录结构如下
代码语言:javascript复制
➜  demoProject tree
.
├── app.js
├── bin #应用启动bin目录
│   └── www
├── package.json #应用的依赖包信息
├── public  #公共文件夹存放资源文件
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes #路由文件夹,实际上可以看做Controller
│   ├── index.js
│   └── users.js
└── views #顾名思义,就是视图了,存放模板文件
   ├── error.jade
   ├── index.jade
   └── layout.jade

7 directories, 9 files

已经打开了解了Express框架的目录结构,第一感觉我们就是:哦,还是老套路,框架的模式还是基于MVC。既然是老套路我也不敢多说,来启动看看。

  • 在Terminal启动demoProject项目服务
代码语言:javascript复制
➜  demoProject ~ DEBUG=start:* npm start

> demoproject@0.0.0 start /home/alic/tutorial/Gogs/demoProject
> node ./bin/www

GET / 200 372.578 ms - 185
GET /stylesheets/style.css 304 3.709 ms - -

demoProject已经在3000端口中运行了 至此,我们已经基本认识Express安装、结构以及运行,接下来呢,我们使用Express NodeJS MySQL做一个简单的实例。


使用Express NodeJS MySQL实现基本业务逻辑增删改查,只有增是粗体,那就只实现增一个喽。

实践环境: SystemOS:Ubuntu Database:MySQL DevLanguage:NodeJS NodeJS-Frame:Express

这次倒过来记录记录,我们先看看完成后的项目目录结构

demoProject

对比Express的基本目录呢,在这里已经新建了几个,详细来说说这几个目录的作用: bean:对象的实体即Class common:项目的架构的通用目录 conf:项目的基本配置目录 dao:拿刀来干,不解释,即model层 utils:工具类封装的存放目录

  • 既然是涉及动态的,我们先来建立数据库,跳过~~
代码语言:javascript复制
mysql> desc user_status;
 ---------- ------------- ------ ----- --------- ---------------- 
| Field    | Type        | Null | Key | Default | Extra          |
 ---------- ------------- ------ ----- --------- ---------------- 
| uuid     | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | NO   |     | NULL    |                |
| password | varchar(40) | NO   |     | NULL    |                |
| qrcode   | varchar(40) | YES  |     | NULL    |                |
 ---------- ------------- ------ ----- --------- ---------------- 
4 rows in set (0.01 sec)
  • 既然使用到MySQL,那就得来安装nodeJS的MySQL驱动,通过npm安装,在Express框架中呢,很简单,只要在package.json文件中声明一下项目的依赖即可!
代码语言:javascript复制
{
  "name": "jobfornodejs",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.16.0",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.0",
    "express": "~4.14.1",
    "jade": "~1.11.0",
    "morgan": "~1.7.0",
    "serve-favicon": "~2.3.2",
    "mysql": "latest"
  }
}

注意,配置完毕之后,是还没有安装的,在项目的根目录执行如下命令就可以了

代码语言:javascript复制
➜  jobForNodeJS git:(master) ✗ sudo npm install 
  • 在Express框架配置MySQL数据库配置信息 在conf/目录下建立MySQL配置信息database.js文件,内容如下:
代码语言:javascript复制
// MySQL数据库配置信息
 mysql = {
        host: 'MySQL主机', 
        user: '数据库用户',
        password: '数据库密码',
        database:'数据库名称',
        port: MySQL的端口号
}

//exports
exports.mysql = mysql
  • 接下来,我们简单封装一下MySQL操作的方法,使用连接池,避免开太多的线程,提升性能。这个该怎么做呢?在common/下建立basicConnection.js文件,代码如下:
代码语言:javascript复制
var mysql = require('mysql');
var $dbConfig = require('../conf/database');

// 使用连接池,避免开太多的线程,提升性能
var pool = mysql.createPool($dbConfig.mysql);

/**
 * 对query执行的结果自定义返回JSON结果
 */
function responseDoReturn(res, result,resultJSON) {
    if(typeof result === 'undefined') {
        res.json({
            code:'201',
            msg: 'failed to do'
        });
    } else {
        res.json(result);
    }
};

/**
 * 封装query之sql带不占位符func
 */
function query(sql, callback) {
    pool.getConnection(function (err, connection) {
        connection.query(sql, function (err, rows) {
            callback(err, rows);
            //释放链接
            connection.release();
        });
    });
}

/**
 * 封装query之sql带占位符func
 */
function queryArgs(sql,args, callback) {
    pool.getConnection(function (err, connection) {
        connection.query(sql, args,function (err, rows) {
            callback(err, rows);
            //释放链接
            connection.release();
        });
    });
}

//exports
module.exports = {
    query: query,
    queryArgs: queryArgs,
    doReturn: responseDoReturn
}
  • 记得很深:在深圳开发服务端的时候,MySQL以及Redis的命令语句都是集中在一个文件的使用键值对配置,下面我们模拟一下这种使用方式,笑:) 使用变量来映射。在common/目录下新建一个sqlCommand.js文件,格式很简单,如下就是一个举例
代码语言:javascript复制
//user_status单一的user_status表SQL-Command
var user_status = {
    insertOne:'INSERT INTO user_status (username, password,qrcode) VALUES(?,?,?)',
};

//exports
module.exports = {
    user_status: user_status
};
  • 已经准备的差不多了,这一步就是处理业务逻辑的核心,归根到底就是增删改查,需要调用MySQL连接池以及SQL命令语句的模块,比如增加一个用户,示例代码如下:
代码语言:javascript复制
var db = require('../common/basicConnection');
var $sqlCommands = require('../common/sqlCommands');

/**
 * 增加用户Action
 */
function addUserAction(req, res, next){
    // 获取前台页面传过来的参数
    var param = req.query || req.params;
    // 执行Query
    db.queryArgs($sqlCommands.user_status.insertOne, 
        [param.username,param.password,param.qrcode], 
        function(err, result) {
            if(!err){
                result = {
                    code: 200,
                    msg:'successful'
                }; 
            }
            // 以json形式,把操作结果返回给前台页面
            db.doReturn(res, result);
        }
    );
}

// exports
module.exports = {
    addUserAction: addUserAction
};
  • 万事俱备只欠东风,接下来就是配置路由,从MVC的模式来讲就是Controller,路由配置在 router/*.js,客户端访问的接口,可以只用正则表达式来控制。
代码语言:javascript复制
var express = require('express');
var router = express.Router();
var userDao = require('../dao/userDao')

/**
 * 用户增加的路由控制接口
 */
router.get('/addUserAction', function(req, res, next) {
  userDao.addUserAction(req,res,next)
});

module.exports = router;

NodeJS Express MySQL基本如此。(⊙o⊙)嗯,O(∩_∩)O哈哈~刚好断网。

0 人点赞