node.js+express+mysql

本贴最后更新于 3050 天前,其中的信息可能已经时过境迁

NodeJS 对前端来说无疑具有里程碑意义,在其越来越流行的今天,掌握 NodeJS 已经不再是加分项,而是前端攻城师们必须要掌握的技能。本文将与同志们一起完成一个基于 Express+MySQL 的入门级服务端应用,即可以对数据库中的一张表进行简单的 CRUD 操作。但本人还是斗胆认为,通过这个应用,可以让没怎么接触后端开发的同志对使用 Node 进行后端开发有一个大致了解。

Express 工程环境准备

1. 安装 express,和 express 项目种子生成器(什么?你问第 1 步为什么不是安装 NodeJS,我也只能呵呵..)

安装 express

npm install express -g

安装 express

|

1

|

npm install express-generator -g

|

2. 创建工程。进入工程目录,运行命令

|

1

|

express projectName

|

expresst 项目种子生成器会帮我们生成 express 相应的工程结构,如下

/bin: 用于应用启动
/public: 静态资源目录
/routes:可以认为是 controller(控制器)目录
/views: jade 模板目录,可以认为是 view(视图)目录
app.js 程序 main 文件

3. 进入工程,安装依赖,然后启动应用
在工程根目录,使用 npm install 安装依赖,使用 npm start 启动应用。完成后,你在命令行工具里会看出如下界面,在浏览器中访问会得到我们应用的默认页面

MySQL 环境准备

1. 当然,首先你要准备好 MySQL 环境。可以参看 http://supportopensource.iteye.com/blog/1415527 进行安装,同时也建议安装一个数据库管理工具,如 navicat for mysql,方便操作

2. 创建表
MySQL 安装好了后,进入到数据库,创建要用到的表(如 user), 结构如下

3. 安装 Node 的 MySQL 驱动(请允许装 X 一下…)
在 package.json 的 dependencies 中新增, “mysql” : “latest”, 并执行 npm install 安装依赖

编写相关代码,整合 Express+MySQL

1. 首先,我们先建几个目录,简单分下层(看出我还是很用心木有?)

在工程根目录新增三个目录:
util – 工具方法
conf – 配置
dao – 与数据库交互

完成后的工程结构

2.在 conf 目录中,编写 mySQL 数据库连接配置

|

1

2

3

4

5

6

7

8

9

10

11

|

// conf/db.js

// MySQL 数据库联接配置

module.exports = {

mysql: {

host: ‘127.0.0.1’,

user: ‘root’,

password: ”,

database:‘test’, // 前面建的 user 表位于这个数据库中

port: 3306

}

};

|

2. 编写 CRUD SQL 语句

|

1

2

3

4

5

6

7

8

9

10

11

|

// dao/userSqlMapping.js

// CRUD SQL 语句

var user = {

insert:‘INSERT INTO user(id, name, age) VALUES(0,?,?)’,

update:‘update user set name=?, age=? where id=?’,

delete: ‘delete from user where id=?’,

queryById: ‘select * from user where id=?’,

queryAll: ‘select * from user’

};

module.exports = user;

|

3. 增加路由及实现数据库的 CRUD

以 C(新增)的具体实现举例,在/routes/users.js 中增加一个路由

1234 // 增加用户router.get('/addUser', function(req, res, next) { userDao.add(req, res, next);});

在 userDao 中实现 add 方法

// dao/userDao.js // 实现与MySQL交互 var mysql = require('mysql'); var $conf = require('../conf/conf'); var $util = require('../util/util'); var $sql = require('./userSqlMapping'); // 使用连接池,提升性能 var pool = mysql.createPool($util.extend({}, $conf.mysql)); // 向前台返回JSON方法的简单封装 var jsonWrite = function (res, ret) { if(typeof ret === 'undefined') { res.json({ code:'1', msg: '操作失败' }); } else { res.json(ret); } }; module.exports = { add: function (req, res, next) { pool.getConnection(function(err, connection) { // 获取前台页面传过来的参数 var param = req.query || req.params; // 建立连接,向表中插入值 // 'INSERT INTO user(id, name, age) VALUES(0,?,?)', connection.query($sql.insert, [param.name, param.age], function(err, result) { if(result) { result = { code: 200, msg:'增加成功' }; } // 以json形式,把操作结果返回给前台页面 jsonWrite(res, result); // 释放连接 connection.release(); }); }); } };
  1. 测试整合是否成功

因为前面实现的是一个 get 请求的 add 方法, 所以可以在浏览器中直接使用地址访问,进入路由, http://localhost:3000/users/addUser?name=xyz&age=18.如果你得到如下 JSON 返回或看到数据表中有上面的数据插入,表示整合成功了

5. 同理,实现 CRUD 其它的方法,最终完整的的 routes/user.js 为:

123456789101112131415161718192021222324252627282930313233 var express = require('express');var router = express.Router(); var userDao = require('../dao/userDao'); /* GET users listing. */router.get('/', function(req, res, next) { res.send('respond with a resource');}); // 增加用户//TODO 同时支持get,postrouter.get('/addUser', function(req, res, next) { userDao.add(req, res, next);}); router.get('/queryAll', function(req, res, next) { userDao.queryAll(req, res, next);}); router.get('/query', function(req, res, next) { userDao.queryById(req, res, next);}); router.get('/deleteUser', function(req, res, next) { userDao.delete(req, res, next);}); router.post('/updateUser', function(req, res, next) { userDao.update(req, res, next);}); module.exports = router;

完整的 userDao.js 为

// dao/userDao.js // 实现与MySQL交互 var mysql = require('mysql'); var $conf = require('../conf/db'); var $util = require('../util/util'); var $sql = require('./userSqlMapping'); // 使用连接池,提升性能 var pool = mysql.createPool($util.extend({}, $conf.mysql)); // 向前台返回JSON方法的简单封装 var jsonWrite = function (res, ret) { if(typeof ret === 'undefined') { res.json({ code:'1', msg: '操作失败' }); } else { res.json(ret); } }; module.exports = { add: function (req, res, next) { pool.getConnection(function(err, connection) { // 获取前台页面传过来的参数 var param = req.query || req.params; // 建立连接,向表中插入值 // 'INSERT INTO user(id, name, age) VALUES(0,?,?)', connection.query($sql.insert, [param.name, param.age], function(err, result) { if(result) { result = { code: 200, msg:'增加成功' }; } // 以json形式,把操作结果返回给前台页面 jsonWrite(res, result); // 释放连接 connection.release(); }); }); }, delete: function (req, res, next) { // delete by Id pool.getConnection(function(err, connection) { var id = +req.query.id; connection.query($sql.delete, id, function(err, result) { if(result.affectedRows > 0) { result = { code: 200, msg:'删除成功' }; } else { result = void 0; } jsonWrite(res, result); connection.release(); }); }); }, update: function (req, res, next) { // update by id // 为了简单,要求同时传name和age两个参数 var param = req.body; if(param.name == null || param.age == null || param.id == null) { jsonWrite(res, undefined); return; } pool.getConnection(function(err, connection) { connection.query($sql.update, [param.name, param.age, +param.id], function(err, result) { // 使用页面进行跳转提示 if(result.affectedRows > 0) { res.render('suc', { result: result }); // 第二个参数可以直接在jade中使用 } else { res.render('fail', { result: result }); } connection.release(); }); }); }, queryById: function (req, res, next) { var id = +req.query.id; // 为了拼凑正确的sql语句,这里要转下整数 pool.getConnection(function(err, connection) { connection.query($sql.queryById, id, function(err, result) { jsonWrite(res, result); connection.release(); }); }); }, queryAll: function (req, res, next) { pool.getConnection(function(err, connection) { connection.query($sql.queryAll, function(err, result) { jsonWrite(res, result); connection.release(); }); }); } };

除了 update 测试外,其它 get 请求都可以直接在浏览器中使用地址 + 参数完成测试。为了模拟 post 请求,同时简单使用下 jade 模板(Express 支持的一种模板引擎),
我们在/views 目录新建三个 jade 文件

updateUser.jade

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

|

extends layout

block content

h1 更新用户资料 form(method=‘post’, action=‘/p/users/updateUser’) div.form-row label span ID: input(type=‘text’,name=‘id’) div.form-row label span name: input(type=‘text’,name=‘name’) div.form-row label span age: input(type=‘text’,name=‘age’) div.form-row input(type=‘submit’)

|

suc.jade

|

1

2

3

|

block content

h1 操作成功!

pre #{JSON.stringify(result)}

|

fail.jade

|

1

2

3

|

block content

h1 操作失败!

pre #{JSON.stringify(result)}

|

以下是更新测试结果

最后,如果你使用的是 idea 或 webStrom 这样的 IDE,你就不需要安装 express 和 express 项目种子生成器了。这两个 IDE 是可以直接创建 NodeJS 项目

小结:

一个 Express 的 helloWorld 就差不多完成了, 可以通过这个链接下载此例子源代码 http://pan.baidu.com/s/1jGvd4Bc。更多 Express 的功能(如日志,自动化测试等),等待大家去解锁,愿玩得愉快!

[转载自:TAT.Fujun的《初识NodeJS服务端开发(Express+MySQL)》](http://www.alloyteam.com/2015/03/sexpressmysql/)
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 印象笔记
    3 引用 • 16 回帖 • 1 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 694 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 18 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 4 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1281 回帖 • 3 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 244 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 271 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 175 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 818 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 84 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 676 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 80 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 119 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    80 引用 • 396 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 490 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 114 回帖 • 173 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25930 引用 • 107475 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 737 关注