是什么
express4.x 开发常用功能备忘录
功能点
- 初始化项目
- 初始化 全局变量配置
- 初始化 模板引擎
- 初始化 路由
- 初始化 mysql 模块
- 初始化 日志 模块
- 初始化 cookie 模块
- 初始化 session 模块
- 功能-文件上传 模块
- 功能-mock 模块
- 案例-用户增删改查
初始化项目
npm install express -gd # 依赖全局安装express
npm install express-generator # 安装辅助工具 添加到命令行
express -e express4.0-starter # 初始化express项目
cd express4.0-starter
yarn # 安装
npm start # 启动
# 开发环境配置-自动启动
npm install node-dev
"scripts": {
"start": "node-dev ./bin/www"
}
# 或者
npm install -g supervisor
"scripts": {
"start": "supervisor ./bin/www"
}
复制代码
初始化 全局变量配置
在 app.js 中引用
// 设置全局静态变量库
app.locals.globals = require('./config/globals');
// globals.js
module.exports = {
avatar:{
dest: '../avatar/',
rename: function (fieldname, filename) {
return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
}
},
baseUrl:'http://127.0.0.1:3000/'
};
复制代码
初始化 模板引擎
控制器得到用户请求后,从模型获取数据,调用模板引擎。
模板引擎以数据和页面模板为输入,生成 HTML 页面,然后返回给控制器,由控制器交回客户端。
修改 app.js
var ejs = require('ejs');
app.engine('.html',ejs.__express);
app.set('view engine', 'html');
复制代码
ejs 语法
// ejs 语法
<% code %>:JavaScript 代码。
<%= code %>:显示替换过 HTML 特殊字符的内容。
<%- code %>:显示原始 HTML 内容。
<%- include layout %> 页面布局
// 模板
<%include commons/header.html%>
<%include commons/footer.html%>
<%= title %>
// 循环
<% for(var i=0; i < users.length; i++) {%>
<tr>
<td><%=users[i].id%></td></td>
</tr>
<% } %>
// js-else
<% if(page =="addUser"){%>
<%} else {%><%}%>
复制代码
初始化 路由
分别修改 app.js 和 创建 router/index.js 添加修改内容
// app.js
var users = require('./routes/users');
app.use('/users', users);
// router.js
var express = require('express');
var router = express.Router();
var usersDao = require('../model/usersDao');
router.get('/', function(req, res, next) {
usersDao.queryAll(req, res, function(data){
res.render('users/list', {
title:title,
users: data
});
});
});
module.exports = router;
复制代码
router 中常用的操作说明
- 一种是利用res.render替换jade(ejs)模板处理view层显示
- 一种是利用res.send发送数据请求直接显示到网页。
- get 请求 req.query.username 获取参数。
- post 请求 req.body.username 获取参数。
- json 返回 res.json({‘code’:’success’,’info’:data});
- req(request)代表客户端的数据,是一个可读流;
- res(response)代表服务端的数据,是一个可写流; 你可以拿到你想要的数据:
- next 函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。next函数主要是用来确保所有注册的中间件被一个接一个的执行,那么我们就应该在所有的中间件中调用next函数,但有一个特例,如果我们定义的中间件终结了本次请求,那就不应该再调用next函数。
// render 映射到 html 中
res.render('users/one',{title:title,user:user});
// 跳转页面
res.redirect('/users');
// json
res.json({ title: 'express4.0 json' })
// send
res.send('<===>some html');
// locals
res.locals.isLogin = req.session.isLogin;
// cookie
res.cookie('name', 'tobi', options);
// 取值
req.params.name // 取值(/user/:name)
req.query.ctime // 取值 (?q=tobi+ferret)
req.param('name') // 取值 (?name=tobi 、/user/:name 、?q=tobi+ferret)
req.body.name // 取值 (post值)
res.redirect('http:// example. com');
// Q:Error: Can't set headers after they are sent.
// 不能发送headers因为已经发送过一次。在处理http请求时,服务器先发送请求头,然后才是请求内容。而一旦创建连接生成了一次请求头后,如果在尝试调用设置请求头的方法res.redirect() 等会报这个错误。
// return res.json({ success: true, message: '成功' });
// 利用return 在response之前 进行返回处理。
// get请求
router.get("/doAjax", function(req, res, next) {
// req 接收请求
var username = req.query.username;
var password = req.query.password;
// res 返回到页面
res.json({
code: "success",
info:
"服务器收到一个Ajax get请求 用户名 [" +
username +
"] 密码 [" +
password +
"]"
});
});
// post请求:
router.post("/doAjax", function(req, res, next) {
// req 接收请求
var username = req.body.username;
var password = req.body.password;
// res 返回到页面
res.json({
code: "success",
info:
"服务器收到一个Ajax post请求 用户名 [" +
username +
"] 密码 [" +
password +
"]"
});
});
复制代码
初始化 mysql 模块
创建 config/server.js 配置文件、 utils 链接数据库工具文件, 创建 models/user.js 模型查询数据库
链接数据库,如 mysql
"mysql": "^2.15.0",
"mysql2": "^1.5.1",
复制代码
// utils
var mysql = require('mysql');
var $conf = require('../config/server'); // 数据库
var utils = {
// 数据库链接
pool: function () {
function extend(target, source, flag) {
for (var key in source) {
if (source.hasOwnProperty(key))
flag ?
(target[key] = source[key]) :
(target[key] === void 0 && (target[key] = source[key]));
}
return target;
}
// 使用连接池,提升性能
return mysql.createPool(extend({}, $conf.mysql));
}
}
// models/user.js
var $utils = require('../utils'); // 工具类
var pool = $utils.pool(); // 数据库链接池
var $sql = require('./usersMapping'); // sql语句
pool.getConnection(function(err, connection) {
connection.query($sql.queryAll, function(err, result) {
if(result.length){
callback(result);
}else{
result = void 0;
}
// jsonWrite(res, result);
connection.release();
});
});
复制代码
初始化 日志 模块
- log4j1.x 用于记录项目中出现的错误日志
- morgan 用于记录访问日志
"morgan": "~1.5.1"
"file-stream-rotator":"~0.0.6"
"log4js":"~1.0.0"
复制代码
修改 app.js
var logger = require('morgan'); // 记录访问日志
var fs = require('fs');
var fileStreamRotator = require('file-stream-rotator');
var logDir = path.join(__dirname, 'logs');
fs.existsSync(logDir) || fs.mkdirSync(logDir);
var accessLogStream = fileStreamRotator.getStream({
date_format: 'YYYYMMDD',
filename: path.join(logDir, 'access-%DATE%.log'),
frequency: 'daily',
verbose: true
});
app.use(logger('combined', {stream: accessLogStream}));
复制代码
使用 logger
var $utils = require('../utils'); // 工具类
var logger = $util.logger(); // 日志管理
logger.info("this is log");//输出日志
复制代码
初始化 cookie 模块
"cookie-parser": "~1.4.3"
复制代码
修改 app.js
var cookieParser = require('cookie-parser'); // cookie配置
app.use(cookieParser('this is key')); // 设置cookies
复制代码
测试 cookie
// router
router.get('/cookie',function(req, res, next) {
const options = {
domain:'127.0.0.1',
path:'/',
maxAge: 10 * 60 * 1000, // cookie有效时长
expires: new Date('2019-02-02'), // cookie失效时间
httpOnly: false, // 是否只用于http请求中获取
overwrite: false // 是否允许重写
}
res.cookie('name', 'tobi', options);
res.send(req.cookies.name); // 输出cookie值
});
复制代码
初始化 session 模块
"express-session": "^1.15.6"
复制代码
修改 app.js
import serverConfig from './config/global.js'
app.use(session({
"resave": serverConfig.session.resave,
"saveUninitialized": serverConfig.session.saveUninitialized,
"secret": serverConfig.session.secret, // 建议使用 128 个字符的随机字符串
"cookie": serverConfig.session.cookie
}));
复制代码
测试 session
req.session.count = req.session.count || 0;
var sessionCount = req.session.count++;
复制代码
功能-文件上传 模块
"multer": "^1.2.0"
复制代码
// router.js
var multer = require('multer');
var fs = require("fs");
var upload = multer({
dest: './avator/',
rename: function (fieldname, filename) {
return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
}
});
router.post('/doUpload',upload.array('image'),function(req, res, next) {
console.log(req.files[0]); // 上传的文件信息
if(undefined == req.files[0]){
res.json(['failed', {msg:"没有选择要上传的文件!"}]);
return -1;
}
var des_file = "./avatar/" + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
fs.writeFile(des_file, data, function (err) {
if( err ){
console.log( err );
res.json(['failed', {msg:err}]);
}else{
response = {
msg:'File uploaded successfully',
filename:req.files[0].originalname,
};
res.json(['success', response]);
}
});
});
});
复制代码
功能-mock 模块
"mockjs": "2.x"
复制代码
创建 mock/index.js
var Mock = require("mockjs");
var Random = Mock.Random;
var data = Mock.mock({
'results|10': [{
'id|+1': 1,
'username':'@name',
'password':'1234',
'sex':Random.integer(1,2),
'age':/\d{2}/,
'photo':'photo.jpg',
'realname':"@cname()"
}]
});
console.log(JSON.stringify(data, null, 4));
复制代码
案例:用户增删改查
包含文件:mock/usersMock.js 、model/usersDao.js 、model/usersMapping.js 、routes/users.js
github: github.com/wolichuang/…
附件:package.json
{
"name": "express4.0-learn",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node-dev ./bin/www"
},
"dependencies": {
"body-parser": "~1.16.0",
"co": "~4.6.0",
"cookie-parser": "~1.4.3",
"debug": "~2.6.0",
"ejs": "~2.5.5",
"express": "~4.14.1",
"express-session": "^1.15.6",
"file-stream-rotator": "^0.2.0",
"mockjs": "^1.0.1-beta3",
"morgan": "~1.7.0",
"multer": "^1.2.0",
"mysql": "^2.15.0",
"mysql2": "^1.5.1",
"node-dev": "^3.1.3",
"serve-favicon": "~2.3.2",
"log4js": "~1.0.0"
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END