express服务器
const express = require("express");//引入express模块
const app = express();//创建服务器应用程序对象
const port=80
//注册接口
//接口:网络接口,一个url路径,对应服务器上一个提供服务的功能,这个功能加上服务器上的一个接口
//第一个参数:url
//第二个参数:接口回调
app.get('/greeting',(req, res)=>{
res.end("hello world")
})
app.get('/6969',(req,res)=>{
res.setHeader('Content-Type', 'text/plain;charset=utf-8')
res.write(`本地ip: ${req.socket.localAddress}\n`) // 当前服务器ip地址
res.write(`本地port: ${req.socket.localPort}\n`) // 当前服务器端口号
// remote 远程: 指的就是客户端
res.write(`远程ip: ${req.socket.remoteAddress}\n`) // 远程ip
res.write(`远程port: ${req.socket.remotePort}\n`) // 远程端口号
res.write("ok")
res.end("成功访问1111111")
})
//启动服务器
app.listen(port,()=>{
console.log("server start on:http://127.0.0.1")
})
服务器的跨越处理
const express = require('express');
const cors = require('cors')
const path = require("path");
const app = express()
//若不记得,可以使用cors包
// app.use(cors())
// 添加一个中间件拦截所有请求
// app.all('*', (req, res, next) => {
// // 设置允许跨域的响应头
// res.setHeader('Access-Control-Allow-Origin', '*')
// res.setHeader('Access-Control-Allow-Methods', '*')
// res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
// next()
// })
app.use('/', express.static(path.join(__dirname, 'public')))
app.get('/test', (req, res) => {
res.json({msg: 'ok'})
})
app.get('/jsonp', (req, res) => {
// const {callback} = req.query
// res.setHeader('Content-Type', 'text/javascript')
// const params = {x: 1, y: 2}
// res.send(`${callback}('${JSON.stringify(params)}')`)
res.jsonp({x: 1, y: 2})
})
app.listen(80, () => {
console.log(`start on: http://127.0.0.1`)
})
中间件和异常处理
const express = require('express');
const ah = require('express-async-handler')
const app = express();
// 若不记得异步处理器该如何写的话,可以安装 express-async-handler 包来代替
// 异步处理器
// 用于捕获异步函数中的异常
// asyncFunction 是一个异步方法
function asyncHandler(asyncFunction) {
// 返回一个接口函数
return (req, res, next) => {
asyncFunction(req, res).catch(next)
}
}
// 声明中间件
app.use((req, res, next) => {
// req, res 就是接口中的请求对象和响应对象
// next 函数在中间件中必须调用
// 调用next有两种情况
// 情况一: 不带参数的调用
// 含义: 放行
console.log('中间件1')
next()
// 情况二: 带参数
// 含义: 直接将参数返回给页面
// next(new Error(`这是next返回给页面的内容,强制被认为是异常,所以状态码为500`))
})
// app.get('/test1', async (req, res, next) => {
// // 接口中的next作用和中间件中一样,但是接口中的next必须传参数
// // next(new Error('test1 error'))
// // 接口内抛出的异常也能被最后个中间件捕获
// // throw new Error('test1 error')
// res.json({msg: 1})
// })
// app.get('/test1', asyncHandler(async (req, res) => {
app.get('/test1', ah(async (req, res) => {
throw new Error('test1 error')
res.json({msg: 1})
}))
app.use((req, res, next) => {
console.log('中间件2')
next()
})
app.get('/test2', (req, res, next) => {
console.log(abc)
res.json({msg: 2})
})
app.use((req, res, next) => {
console.log('中间件3')
next()
})
app.get('/test3', (req, res) => {
res.json({msg: 3})
})
// 在所有中间件的末尾,添加一个异常处理的中间件
// 此异常捕获中间件参数必须以 err 开头
// 此中间件的触发条件有:
// 1. 任意接口抛出异常
// 2. 任意接口或中间件的next调用后传了参数
app.use((err, req, res, next) => {
// 打印异常
console.error(err)
res.json({success: false, msg: err.message})
// next(err)
})
app.listen(80, () => {
console.log('server start on: http://127.0.0.1')
})