使用node搭建你的后台服务器

最近工作稍微缓解了一下,想整理一下关于nodejs的文章
目前准备写一个系列来引导大家上手开发
我们作为前端已经能写一些漂亮的页面了
但是有一点遗憾,我们不能用java或者php来搭建后台系统
这一期,我们花点时间,打通前端的任督二脉,实现从前端到后端
从页面交互到后台数据库建模,从静态页面到controller、service
真正的走向全栈开发。
这次的文章,我们尽量对每一个插件进行分析
由浅入深,慢慢丰富。
大纲:

  • node环境搭建
  • co
  • koa1
  • redis
  • sequelize
  • nosql/mysql

后台搭建:

  • 数据库建模
  • model搭建
  • service
  • controller方法实现
  • 404错误拦截/未登陆index拦截

前端搭建(次要):

  • react+redux+webpack

整个功能实现方面,目前初步的想法是做一套基于微信公众号的电商系统后端
需求大纲:

  • 用户关注取关
  • 用户注册
  • 商品管理后台
  • 订单系统
  • 物流信息
  • 评价系统

最开始会有一些环境搭建,工程搭建相关的知识点整理
后续会慢慢加入一些简单功能,实现一套mvc
慢慢完善项目
所以这件事情的周期大概在半年左右吧
故事长,还请别失望
好了,开始迈出第一步吧

一.环境搭建:

1.安装nodejs
    到http://nodejs.cn/download/下载对应安装文件
    下载完成后双击开始安装就可以。
    最新的nodejs已经包含了npm包管理器,npm是啥呢,管理所有的js插件,不用到处去找下载地址
    npm会帮你管理你的js组件。
2.配置cnpm镜像
    npm下载组件是需要翻墙的,为了方便,我们需要将npm的下载地址映射到国内服务器
    刚好淘宝团队帮忙做了这件事情
    访问后面链接,配置淘宝镜像:https://npm.taobao.org/

做完这两步之后,我们开发必须的基础环境已经准备好了。

二.项目搭建:
下面开始搭建我们的项目框架
这次的项目框架不能像之前的前端框架了,但是差不太多,参考一下我的吧:

————————————————————————————————————————————————————————————
  |--logs  //日志目录
  |
  |--node_models   //node自己创建,不需要手动创建,node组件存放位置
  |
  |--server
       |
       |--lib              //依赖包
       |
       |--config           //配置文件目录
       |
       |--util             //工具函数
       |
       |--db               //数据字典
       |
       |--api              //后台接口目录,建议在加一层目录,方便加namespace
       	   |
  	   |--model        //数据库操作
           |
           |--services     //服务目录
           |
           |--controller   //方法目录
           |
           |--routes       //路由存放
  	— —
       |
   — — —
  |
  |--app.js                //启动文件
  |
  |--package.json          //项目依赖
————————————————————————————————————————————————————————————
参照此结构搭建项目结构

看下实际结构:
WX20170322-221735@2x
package.json文件和node_models文件无需手动创建
项目结构搭建好之后,我们要开始下一步

三.增加依赖
首先我们要有一个整体的框架基础,也就是我们之前说的koa
express和koa应该有的人听过,非常不错的两个框架,我们在这做一下简单的介绍:
先说express,express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,
它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。
使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率
总的来说,Express和koa都是服务端的开发框架,
服务端开发的重点是对HTTP Request和HTTP Response两个对象的封装和处理,应用的生命周期维护以及视图的处理等。
koa是一个比express更精简,使用node新特性的中间件框架,相比之下express就是一个庞大的框架
如何选择呢?

  • 如果你喜欢diy,很潮,可以考虑koa,它有足够的扩展和中间件,而且自己写很简单
  • 如果你想简单点,找一个框架啥都有,那么先express

从我个人来说,我欠缺框架的整体设计能力,但我还是想挑战一下自己,所以选择了koa框架
好了,就介绍这么多,想了解更多可以直接去官网了解。

下面开始安装koa

$ cd goose/src/
$ cnpm install koa --save-dev

然后我们去补充一下作者信息和版本信息
打开src目录下的package.json文件

{
  "name": "goose-api",
  "author": "wenqiang",
  "version": "1.0.0",
  "main": "app.js",
  "devDependencies": {
    "koa": "^2.2.0"
  }
}

好了,一个毛坯版本的server已经搭建好了
是不是迫不及待的想run一下看下效果?
别急,入口文件app.js还没写呢
我们在它里面实现一下hello world
打开app.js,补充代码:

let koa = require('koa');
let app = new koa();
app.use(function*(){
  this.body = "hello koa!";
});
app.listen(8080);

简单的几句话,引用koa,获取koa实例,执行方法,监听端口
来吧,run一下,进入到src目录下

$ node app.js

好了,打开你的地址:http://localhost:8080/
WX20170322-232849@2x
我们已经实现了第一个hello world的简单实例
收起这一点点小兴奋,这才是万里长城的第一步
下一步我们要做什么呢?
我们来一步一步实现一个get请求
通过访问:http://localhost:8080/user/1
来获取我们第一个用户的信息。
明确需求,开整.
从后往前,首先我们要有一个数据库,一个User表

四.配置数据库

在使用NodeJS来操作数据库时,为了方便,通常都会选择一个合适的ORM(Object Relationship Model)框架。
毕竟直接操作SQL比较繁琐,通过ORM框架,我们可以使用面向对象的方式来操作表。
NodeJS社区有很多的ORM框架,我比较喜欢Sequelize,它功能丰富,可以非常方便的进行连表查询。

——-0327补充———
周末搞了两天react,最近入职新东家了,所以node的文章更新的慢点,大家多理解
我们接着上次继续讲

首先安裝mysql服务:
去下一个mysql并安装到本地:https://www.mysql.com/downloads/
再装一个图形管理工具workbench:https://dev.mysql.com/downloads/workbench/
安装mysql和sequelize组件:

$ cnpm install sequelize --save-dev
//安装mysql
$ cnpm install mysql --sqve-dev

安装好mysql和之后,我们新建一个数据库goose,并且将数据库初始密码改掉
新建一个表users,参考我的配置:
QQ20170327-2@2x
创建好之后我们需要修改代码,使用sequelize来关联到数据库

修改app.js

let koa = require('koa');
let app = new koa();

//创建sequelize对象:
var Sequelize = require('sequelize');
let sequelize = new Sequelize('goose', 'root', 'asdw123123', {
    host: '127.0.0.1',
    dialect: 'mysql'
});

//创建表对应的对象模型
//一条记录对应一个User对象。
let User = sequelize.define('user', {
    name: Sequelize.STRING,
    password: Sequelize.STRING,
    mail: Sequelize.STRING
});

// 插入记录
// 调用模型对象的create方法插入一条user记录。
// 通过promise的方式对插入完成和插入失败进行处理,链式调用非常方便,再也看不到callback了。
User.create({
    name: 'koa',
    password: '1234567890',
    mail: 'wenqiang@qq.com'
}).then(function(result){
    console.log('inserted koa ok');
}).catch(function(err){
    console.log('inserted koa error');
    console.log(err.message);
});

app.use(function*(){
    this.body = "hello koa!";
});
app.listen(8080);

ok,run一下,执行node app.js
控制台输出以下内容,代表插入数据成功了
QQ20170327-3@2x
可以打开woekbench看一下这条数据
QQ20170327-4@2x
数据库操作无非增删改查,我们已经实现了增加,那我们顺便实现以下其他的:

查询:
在create之后补充代码:

//查询
User.findAll({
    where:{
        name:{
            $like:'k%'
        }
    }
}).then(function(result){
    console.log('query all users');
    for (var i = 0, usr; usr = result[i++];) {
        console.log('name=' + usr.name + ', password=' + usr.password + ', mail=' + usr.mail);
    }
});

结果:
QQ20170327-5@2x

修改:

//修改,在第一个参数中指定更新的字段和值,在第二个参数中指定条件。
User.update({
    password:'12'
},{
    where:{
        name:{
            $like:'koa%'
        }
    }
}).then(function(result){
    console.log('updated user');
    console.log(result);
});

结果:
QQ20170327-6@2x

删除:

//删除,调用模型对象的destroy方法进行删除操作,在参数中指定删除条件。
User.destroy({
    where:{
        name:{
            $like:'koa%'
        }
    }
}).then(function(result){
    console.log('destroy user');
    console.log(result);
});

篇幅问题,这节就先讲到这里,到此我们做个简单的总结:
我们使用koa简单的搭了一个项目框架
并且能使用sequelize操作本地数据库进行增删改查
server端最重要的就是数据的存储与操作,这一关过去了后面就不难了
源码已经上传到github上,并且会持续更新,大家多多支持:
https://github.com/adminV/goose
我们下节继续……….