参考资料
NodeJS搭建服务器环境
首先安装node
// 检测是否安装成功
node -v
npm -v
方法一
//安装服务器,生成dist文件夹,里边就是生产的静态html文件,直接放到服务器端进行运行了。
npm install -g live-server
// 进入目录
cd dist
// 启动服务器
live-server // 启动服务器
方法二
// 进入目录
cd demo
// 安装服务器
npm install -g http-server
// 启用服务器
http-server
// 默认端口是:8080,在浏览器中输入localhost:8080就可以使用了
NodeJS搭建后端框架
创建项目
mkdir admin-node
cd admin-node
npm init -y
安装依赖
npm i -S express
创建app.js
const express = require('express')
const app = express()
function myLogger(req, res, next) {
console.log('myLogger')
next() // 一定要调用
}
// 中间件的调用在请求发起之前
app.use(myLogger)
app.get('/', function(req, res){
res.send('hello node')
})
const server = app.listen(5000, function(){
const { address, port } = server.address()
console.log('Http Server is running on http://%s:%s', address, port)
})
启动项目
node app.js
在浏览器输入localhost:5000,即可看到 hello node
express三大基础概念
中间件
-
中间件是一个回调函数,在请求和响应周期中被顺序调用。
-
next() 一定要调用,不然程序执行将被终止。
-
中间件一定要在请求发起之前进行响应,因为请求发起之后中间件就响应不到了。
// ......
const app = express()
function myLogger(req, res, next) {
console.log('myLogger')
next() // 一定要调用
}
// 中间件的使用,在get或者post请求发起之前
app.use(myLogger)
app.get() 或者 app.post()
// ......
路由
- 应用如何响应请求的一种规则。
响应 / 路径的 get 请求:
app.get('/', function(req, res) {
res.send('hello node')
})
响应 / 路径的 post 请求:
app.post('/', function(req, res) {
res.send('hello node')
})
规则主要分两部分:
- 请求方法:get、post......
- 请求的路径:/、/user、/.*fly$/......
异常处理
通过自定义异常处理中间件处理请求中产生的异常。
app.get('/', function(req, res) {
throw new Error('something has error...')
})
const errorHandler = function (err, req, res, next) {
console.log('errorHandler...')
res.status(500).json({
error: -1,
msg: err.toString()
})
// res.send('down...')
}
app.use(errorHandler)
使用时需要注意两点:
-
第一,参数一个不能少,否则会视为普通的中间件
-
第二,中间件需要在请求之后引用
后置的处理请求通常都是用来做异常处理,而前置的通常用来做一些日志,跨域这一类的操作。
项目框架优化
在以上的项目搭建的基础上进行如下优化
安装 boom 依赖:最大的好处是帮我们快速生成一些异常信息。
npm i -S boom
router
router文件夹用来处理全局的异常。也就是把整个路由变成中间件。然后在app.js里引入require('./router'),这样全局的路由就全部托管到这个router下面来进行处理。
index.js
处理路由的监听。
const express = require('express')
const boom = require('boom')
const userRouter = require('./user')
const {
CODE_ERROR
} = require('../utils/constant')
// 注册路由
const router = express.Router()
router.get('/', function(req, res) {
res.send('欢迎学习小慕读书管理后台')
})
// 通过 userRouter 来处理 /user 路由,对路由处理进行解耦
router.use('/user', userRouter)
/**
* 集中处理404请求的中间件
* 注意:该中间件必须放在正常处理流程之后
* 否则,会拦截正常请求
*/
router.use((req, res, next) => {
next(boom.notFound('接口不存在'))
})
/**
* 自定义路由异常处理中间件
* 注意两点:
* 第一,方法的参数不能减少
* 第二,方法的必须放在路由最后
*/
router.use((err, req, res, next) => {
const msg = (err && err.message) || '系统错误'
const statusCode = (err.output && err.output.statusCode) || 500;
const errorMsg = (err.output && err.output.payload && err.output.payload.error) || err.message
res.status(statusCode).json({
code: CODE_ERROR,
msg,
error: statusCode,
errorMsg
})
})
module.exports = router
use.js
const express = require('express')
const router = express.Router()
router.get('/info', function(req, res, next) {
res.json('user info...')
})
module.exports = router
utils
constant
module.exports = {
CODE_ERROR: -1
}
app.js
const express = require('express')
const router = require('./router')
const app = express()
app.use('/', router) // 全局的路由全部托管到这个router下面来进行处理。
const server = app.listen(5000, function(){
const { address, port } = server.address()
console.log('Http Server is running on http://%s:%s', address, port)
})