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

前言
我的天呐,上了一个上午的课,下午呆呆地在图书馆用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

➜  ~ 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文件添加如下的环境信息

#NodeJS
export NODE_HOME=/env/node-6.10.0
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_module

来看看是否安装成功了呢

➜  ~ 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
➜  ~ sudo npm install express express-generator -g
# 安装过程省略 ... ...
➜  ~ express --version
4.14.1

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

  • 使用express命令初始化demoProject项目
➜  ~ express demoProject

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

  • demoProject目录结构如下
➜  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项目服务
➜  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:工具类封装的存放目录

  • 既然是涉及动态的,我们先来建立数据库,跳过~~
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文件中声明一下项目的依赖即可!
{
  "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"
  }
}

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

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

//exports
exports.mysql = mysql
  • 接下来,我们简单封装一下MySQL操作的方法,使用连接池,避免开太多的线程,提升性能。这个该怎么做呢?在common/下建立basicConnection.js文件,代码如下:
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文件,格式很简单,如下就是一个举例
//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命令语句的模块,比如增加一个用户,示例代码如下:
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,客户端访问的接口,可以只用正则表达式来控制。
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哈哈~刚好断网。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,363评论 25 707
  • 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装 1.1BLOG文档结构图 ...
    小麦苗DB宝阅读 10,492评论 0 31
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • “白桦为什么颤抖,妈妈?” “它在细听鸟儿说话。” “鸟儿说些什么,妈妈?” “说仙女傍晚把它们好一顿吓。” “仙...
    酒柒柒阅读 831评论 0 0
  • 小时候自以为写了一篇好作文就恨不得全世界都知道,就算装作谦虚表面上不动声色,其实内心里也巴不得有人看到。而大一点,...
    路西橘子阅读 182评论 0 0