管理后台-后端-Node.js篇
2016-01-05 16:17
369 查看
Node.js的框架种类繁多,我们选用了Express做为web框架,结合Sequelize做为数据库ORM框架。
我们先来搭建基础环境
软件环境
Node.js
Express
Sequelize
顺利的话浏览器访问如下
![](http://img.blog.csdn.net/20160105103333653)
nodejs默认是将js加载在内存中,对于代码的改变,需要重启服务才能生效,读者可以安装supervisor或者hotnode插件来做auto-reload。
数据库建模
1)配置数据库连接
2)创建migration
上述指令会在子目录migrations创建一个带时间戳的migration文件,在子目录models创建一个数据库模型news.js
3)cli执行migrate
上述指令会在数据库中创建news表
书写最简单的CRUD
加入路由
使用postman测试接口
…
书写扩展协议-批量删除
书写扩展协议-搜索+分页
补全认证接口
求简,我们直接在index.js里面注入认证的路由
加入BasicAuth认证
github上有写好的中间件basic-auth-connect供下载,但是Express4对于中间件的架构做了调整,按照该中间件文档使用是无效的,所以我们自己来手写中间件
入口注入该中间件
加入CORS跨域访问支持
注意,cors必须放置在BasicAuth之前才能工作。
我们先来搭建基础环境
软件环境
Node.js
Express
Sequelize
> yum install epel-release ### 让yum支持nodejs安装 > yum install nodejs ### 安装nodejs > yum install npm ### 安装npm(用来安装nodejs第三方库) > mkdir RestfulProject ### 创建项目目录 > cd RestfulProject > npm install express-generator ### 安装Express > node_modules/.bin/express -f ### Express创建项目框架 > npm install ### 安装框架需要的第三方库 > npm install --save sequelize sequelize-cli sqlite3 basic-auth cors > node_modules/.bin/sequelize init ### Sequelize初始化 > PORT=8000 npm start ### 启动服务
顺利的话浏览器访问如下
nodejs默认是将js加载在内存中,对于代码的改变,需要重启服务才能生效,读者可以安装supervisor或者hotnode插件来做auto-reload。
数据库建模
1)配置数据库连接
// config/config.json "development": { ... "dialect": "sqlite", "storage": "db.sqlite3" },
2)创建migration
> node_modules/.bin/sequelize model:create --name News --attributes title:string,content:text,create_time:date
上述指令会在子目录migrations创建一个带时间戳的migration文件,在子目录models创建一个数据库模型news.js
3)cli执行migrate
> node_modules/.bin/sequelize db:migrate
上述指令会在数据库中创建news表
书写最简单的CRUD
// routes/news.js var News = require('../models').News; var express = require('express'); var router = express.Router(); router.post('/',function(req,res){ var form = req.body; form.create_time = Date.now(); News.create(form).then(function(data){ res.status(201).json(data); }); }) router.get('/', function(req, res) { News.findAll().then(function(data){ res.json(data); }) }); router.route('/:id/') .get(function(req,res){ News.findOne({ where:{ id:req.params.id } }) .then(function(data){ res.json(data); }); }) .put(function(req,res){ News.update(req.body,{ where:{ id:req.params.id } }) .then(function(data){ res.json({}) }); }) .delete(function(req,res){ News.destroy({ where:{ id:req.params.id } }) .then(function(data){ res.json({}) }); }); module.exports = router;
加入路由
// app.js ... var news = require('./routes/news'); var app = express(); ... app.use('/news', news);
使用postman测试接口
…
书写扩展协议-批量删除
// routes/news.js ... router.delete('/deletes/',function(req,res){ News.destroy({ where:{ id:{ $in:req.query.ids.split(',') } } }) .then(function(){ res.json({}) }) })
书写扩展协议-搜索+分页
// routes/news.js var PAGE_SIZE=50; ... router.get('/', function(req, res) { var search = req.query.search||''; var page = parseInt(req.query.page||1); News.findAndCountAll({ where:{ title:{ $like:'%'+search+'%', } }, order:[ ['create_time','DESC'], ], limit:PAGE_SIZE, offset:PAGE_SIZE*(page-1), }) .then(function(data){ var total_count = data.count; var page_count = Math.floor(total_count/PAGE_SIZE); if(total_count%PAGE_SIZE>0){ page_count++; } data = { total_count:data.count, page_count:page_count, next:page<page_count, previous:page>1, results:data.rows, } res.json(data) }); })
补全认证接口
求简,我们直接在index.js里面注入认证的路由
// routes/index.js ... router.get('/auth/info', function(req, res, next) { res.json({username:'test',userid:1}); });
加入BasicAuth认证
github上有写好的中间件basic-auth-connect供下载,但是Express4对于中间件的架构做了调整,按照该中间件文档使用是无效的,所以我们自己来手写中间件
// utils.js /** * Your utility library for express */ var basicAuth = require('basic-auth'); /** * Simple basic auth middleware for use with Express 4.x. * * @example * app.use('/api-requiring-auth', utils.basicAuth('username', 'password')); * * @param {string} username Expected username * @param {string} password Expected password * @returns {function} Express 4 middleware requiring the given credentials */ exports.basicAuth = function(username, password) { return function(req, res, next) { var user = basicAuth(req); if (!user || user.name !== username || user.pass !== password) { res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); return res.status(401).json(); } next(); }; };
入口注入该中间件
// app.js ... var utils = require('./utils'); ... app.use(utils.basicAuth('admin', '111111')); app.use('/', routes); ...
加入CORS跨域访问支持
//app.js ... var cors = require('cors'); ... app.use(cors()); app.use(utils.basicAuth('admin', '111111')); ...
注意,cors必须放置在BasicAuth之前才能工作。
相关文章推荐
- 10个常见的Node.js面试题
- 解读Nodejs多核处理模块cluster
- 【LeetCode】Swap Nodes in Pairs
- NodeJS 产生一个随机数字字符串
- Node.js上传文件和遍历目录
- 又一次认识HTML,CSS,Javascript 之node-webkit 初探
- jqGrid增删改查显示——删除+nodejs后台
- nodejs启动守护程序pm2
- jqGrid增删改查显示——修改+nodejs后台
- nodeJS接受post传过来的参数
- jqGrid增删改查显示——增加+nodejs后台
- Lintcode: Remove Node in Binary Search Tree
- 【翻译自mos文章】ACFS 使用inode 架构吗?
- Populating Next Right Pointers in Each Node
- Node.js使用fs.renameSync报cross-device link not permitted错误
- NodeJS获得Cookie
- windows删除node_modules[文件名或扩展名太长,目录层次超过无法删除的问题]
- windows删除node_modules[文件名或扩展名太长,目录层次超过无法删除的问题]
- Remove Nth Node From End of List leetcode
- nodejs review-02