下载APP

NodeJS

参考资料

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)
})
在线举报