9.配置package.json 中的scripts(执行命令)
"prebuild","prestart" 可以不配置,如果网非常差,前提node_module安装完美
"prebuild": "npm install"
"build": "babel ./src -d ./dist",
"predev": "npm install",
"dev": "supervisor ./index",
"prestart": "npm run build",
"start": "supervisor ./dist/bin/www"
开发环境
npm install 安装依赖包
npm run build 编译代码
npm run dev 通过babel-register改写require命令
生成环境
npm install -production 安装依赖包
npm run build 编译代码
npm start 直接执行app.js不需要改写babel-register命令
扩展(如果有需要请继续)
1.修改src/app.js src/config.js
修改config.js代码如下
viewPath: path.join(__dirname, './../views'),
publicPath:path.join(__dirname,'./../public'),
staticPath:path.join(__dirname,'./../static'),
node_modulesPath:path.join(__dirname,'./../node_modules'),
修改app.js中静态资源配置信息为
app.use('/public',express.static(config.publicPath));
app.use('/node_modules',express.static(config.node_modulesPath));
app.use('/static',express.static(config.staticPath));
2.使用ES6语法更新js代码
常用的语法有
var http = require('http') --> import http from 'http';//全部导入
var path = require('path') --> import { join } from 'path';//导入指定方法
var myModel = require('./myModel') --> import * as myModel from './myModel';//导入自定义模块
export function methodName(){}//在自定义模块中创建一个方法
export default methodName/objName;//使用export default 命令
通过 const 定义常量
通过 let 定义变量
使用模板字符串
通过class 定义类
直接函数名(){..}定义函数,无需通过function关键字
3.添加ORM框架--sequelize
安装 npm install sequelize
在config.js文件中添加数据库配置信息
DB_HOST:"127.0.0.1",
DB_USER:"root",
DB_PASSWORD:"root",
DB_DATABASE:"itcast",
DB_PORT:"3306",
DB_DIALECT : "mysql"
在src目录添加数据库工具sequelize.js
import Sequelize from "sequelize"
import Config from './config'
const sequelize = new Sequelize(Config.DB_DATABASE, Config.DB_USER, Config.DB_PASSWORD,{
host: Config.DB_HOST,
dialect: Config.DB_DIALECT
});
export default sequelize
在src目录下新建mapper文件夹,存放ORM映射文件,比如
import sequelize from '../sequelize'
import Sequelize from 'sequelize'
const User = sequelize.define('t_user',{
user_name: Sequelize.STRING,
user_password: Sequelize.STRING
});
4.将代码修改成restful风格
修改routes目录下的 JS文件,我修改users.js为例代码如下
import express from 'express';
import handler from '../controllers/users';
const router = express.Router();
/* GET users listing. */
router.get('/users', handler.getAllUsers);
//router.post('/users/:id', handler.getAllUsers);
//router.put('/users/:id', handler.getAllUsers);
//router.delete('/user/:id', handler.getAllUsers);
export default router;
5.错误处理
在app.js中已经添加了错误处理中间件,只需要再程序中修改代码即可
以前错误直接throw err, 现在修改为return next(err)即可
以controllers/users.js为例
getAllUsers: function (req, res, next) {
readFile('xx',(err)=>{
if(err){
return next(err)
}
})
}
6.让路由自动扫描摆脱手动配置的束缚
1.安装glob
npm install --save glob
2.在config.js中添加路由目录
routePath: path.join(__dirname, 'routes/**/*.js');
3.在app.js钟引入glob,并且将之前写死的路由替换掉 注意:因为glob是异步,必须在加载完路由后才能加载404页面和错误页面,顺序不能乱这里使用ES6的Promise语法
之前的
//手动载入路由
app.use('/', index);
app.use('/api/users', users);
修改之后的
//自动载入路由,glob是异步的,错误处理应该在路由加载完毕后加载
new Promise((resolve, reject) => {
glob(config.routePath, (err, files) => {
if (err) {
logger.error('自动载入路由失败'+err.message);
}
files.forEach((filePath) => {
const router = require(filePath).default;
if (typeof router === 'function') {
app.use(router.prefix, router);
logger.info('路由添加成功,路由前缀:' + router.prefix);
}
});
resolve();
})
}).then(function () {
logger('app.js').info('自动载入路由成功');
//配置404页面
app.use((req, res, next) => {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
//配置错误处理中间件,以前错误直接throw err, 现在修改为next(err)即可
app.use((err, req, res, next) => {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error.html');
});
})
4.修改routes目录下的所有路由: 给路由挂载访问前缀
例如之前app.js中配置users路由是app.use('/api/users',users),前缀就是/api/users
只需要在users.js钟创建完毕route对象后添加前缀就可以
const router = express.Router();
router.prefix = '/api/users';
7.服务器端口配置
之前端口是写死在src/bin/www.js文件中的,现在将端口配置到config中
1.在config.js中添加配置信息
serverPort: "5000",
2.修改src/bin/www.js文件 引入config
import config from './../config'
修改代码var port = normalizePort(process.env.PORT || 3000);,修改为
var port = normalizePort(process.env.PORT || config.serverPort);
8.添加express代理中间件
1.安装http-proxy-middleware
npm install --save http-proxy-middleware
2.在config.js中添加,注意必须指定协议,我这里是http
proxyPrefix:'/api',
proxyTarget:'http://127.0.0.1:3000',
3.修改app.js
引入插件
import proxy from 'http-proxy-middleware';
添加中间件,越早引入越好,这样速度会比较快
if(config.proxyTarget &&config.proxyPrefix && config.proxyTarget!=""){
app.use(config.proxyPrefix, proxy({target: config.proxyTarget, changeOrigin: true}));
console.log('代理配置成功,代理uri:'+config.proxyPrefix+" 服务器: "+config.proxyTarget);
}
9.添加日志
express默认使用的是morgan,这里替换成log4js
1.安装log4js npm install --save log4js
2.在src目录添加logger.js文件,内容如下
import log4js from 'log4js'
log4js.configure({
appenders: [
{
type: 'console',
category: "console"
}, //控制台输出
{
type: "file",
filename: 'logs/log.log',
pattern: "_yyyy-MM-dd",
maxLogSize: 20480,
backups: 3,
category: 'dateFileLog'
}//日期文件格式
],
replaceConsole: true, //替换console.log
levels:{
dateFileLog: 'debug',
console: 'debug'
}
});
const dateFileLog = log4js.getLogger('dateFileLog');
const consoleLog = log4js.getLogger('console');
export default dateFileLog;//生产环境
// export default consoleLog;//开发环境
3.在app.js中配置中间件
import log4js from 'log4js';
//配置日志
app.use(log4js.connectLogger(logger, {level:'auto', format: ':method :url'}));
4.在某个js中使用日志记录功能,比如app.js
//引入刚才新建的logger.js
import logger from './logger';
//调用logger.trace, debug, info, warn, error, fatal 方法
logger.debug("加载图标成功");
logger.error("失败");
5.在开发环境和生产环境中改变log的输出
开发环境输出到控制台,logger.js中用export default dateFileLog;
生产环境输出到文件,logger.js中用export default consoleLog;
6.修改supervisor 启动设置
因为我们的supervisor监控项目,只要有文件发生改变就回重启,而日志会不停的向文件中写入,这个时候要忽略日志文件 修改启动项 supervisor -i logs,README.MD,node_modules ./index
10.配置sesssion
1.安装npm install --save express-session
2.在app.js钟添加中间件
//配置session
app.use(session({
secret: config.sessionSecret,
cookie: {maxAge: 80000 }, //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
resave: false,
saveUninitialized: true,
}));
11.最后添加一些可能用到的npm包
formidable 图片上传
validator node后端表单校验
open node程序启动完毕,自动打开浏览器
express-session
http-proxy-middleware express中间代理
glob 文件搜索用到,可递归搜索
moment.js 时间处理 moment().format();
art-template
got |
|