npm init -y
生成package.json文件
相较于npm init
省去了回车
es6模块化
node不能直接编译es6
安装:
npm i -S babel-cli babel-preset-env babel-plugin-add-module-exports
检验是否安装成功
①package.json中配置start—>②配置.babelrc文件—>③npm run start
.babelrc文件作用: Bable在执行编译过程中,会从根目录下找到.babelrc文件中读取配置(安装babel无法正常工作 需要配置文件)
启动项目
npm run start
跨域写在拦截器中
保存项目自动重启服务
npm i -S nodemon
// config/myexpress.js
let express = require('express')
let bodyparse = require('body-parser')
let util = require('util')
export default function (){
let app = express()
// 暴露app.listen 把监听方法延迟
app.listenAsync = util.promisify(app.listen)
// 跨域
app.use((req, res, next) =>{
// 来源 方法 头(token...)
res.setHeader('Access-Control-Allow-Orgin', '*')
res.setHeader('Access-Control-Allow-Methods', '*')
res.setHeader('Access-Control-Allow-Headers', '*')
next()
})
// 解析前端json格式
app.use(bodyparse.json())
// 解析前端发来的表单格式
app.use(bodyparse.urlencoded({extended: true}))
app.get('/', (req, res) =>{
res.status(200).send('hello')
})
// app.listen(3000, () =>{
// console.log('port ok')
// })
return app
}
// server.js
import myexpress from './config/myexpress'
let server = myexpress()
let port = 5000
server.listenAsync(port).then(()=>{
console.log('启动服务')
});
日志
npm i -S winston
前端有浏览器
后端的日志可以输出到文件夹 方便运维观察
// util/loggers.js
const {createLogger, format, transports, transport} = require('winston')
const myFormat = format.printf(log =>{
return `${log.timestamp} ${log.level}:${log.message}`
})
const logger = createLogger({
level: 'warn',
format: format.combine(
format.timestamp({format: 'YYYY-MM_DD HH:mm:ss'}),
myFormat
),
// 输出日志的地方
transports: [
new transports.Console(),
// 日志文件
new transports.File({filename: './logs/applog.log'})
]
})
export default logger
系统配置
npm i -S cross-env
cross-env可以配置环境变量
通过cross-env在程序启动前设置环境变量PORT
启动时看是否在环境中配置,若配置就用环境中的,否则就使用自定义的
路由和控制器
把路由单独抽离 动态加载所有路由
在路由中绑定控制器对应的方法
控制器分离业务逻辑
// controllers/user.ctrl.js
// 用户接口 控制器 业务逻辑
const userCtrl = {
login: function(req, res) {
res.send('hello')
}
}
export default userCtrl
// routes/user.route.js
import express from 'express'
const router = express.Router()
import userCtrl from '../controllers/user.ctrl'
export default function(app) {
router.route('/user/login').get(userCtrl.login)
router.route('/user/query').get()
app.use('/api', router)
}
// myexpress.js
let fs = require('fs')
let path = require('path')
// 1.添加路由
require( process.cwd() + '/app/routes/user.route')(app)
// 2.动态加载路由
let currentDir = process.cwd()
let routeDir = currentDir + '/app/routes'
fs.readdirSync(routeDir).forEach(file =>{
console.log(file)
let newPath = path.join(routeDir, file)
require(newPath)(app)
})
后端服务分层(还未学完)
前端请求通过路由—>控制层—>服务层—>ORM数据访问层—>数据库
控制层:对参数进行 检查校验 不合格的直接返回
服务层:拿数据进行业务处理、查询、统计
ORM数据访问层/sql:去数据库取数据
数据的访问方式:
ORM—通过js对象的方式访问数据,不需要sql
sql—通过写脚本查询数据