一,express基础
新建serve.js, npm init -y, 安装express包
// 1.引入express const express = require("express"); // 2.创建服务器应用实例,app->application const app = express(); /* 4.注册路由(接口) app.get(参数一,参数二)->创建get路由 参数一:路由路径 参数二:回调函数,接收两个实参 request->请求报文对象 response->响应报文对象 */ app.get("/test",function(request,response){ console.log('/test'); // 通过response.end方法可以返回数据 response.end('haha') }) /* 功能:测试接口,获取数据,跑通前后端 method:GET 接口地址:/test 必传参数:无 */ app.post("/login",function(request,response){ console.log("/login"); response.end("login success!") }) // 3.运行服务器应用,并监听端口 // 端口号可以任意选择,但是不要小于1000 app.listen("3001",function(err){ if(err){ console.log('服务器连接失败',err) }else{ console.log('服务器启动成功,启动于http://localhost:3001上') } })
路由相关
const express =require('express'); const app = express(); /* 面试题一:什么是路由 1)路由就是对象 2)可以使用键值对表示 key:value 3)key:路由路径 4)value:请求返回的数据 5)let obj={name1:xiaoming} obj.name1->xiaoming 面试题二:路由分类 1.前端路由 1)前端路由的解析是由js库负责的(vue-router,react-router-dom) 2)前端路由不走网络传输层 3)前端路由获取到的是'组件' 总结:前端路由就是路由路径和路由组件之间的映射关系 2.后端路由 1)后端路由的解析是由服务器负责 2)需要前端发送请求触发 3)后端路由获取到的是响应数据(json) 总结:后端路由就是路由路径+请求方式,与回调函数之间的映射关系 */ /* 路由传参: 1.GET 1)query传参-> url?key=value&key2=value2 ->req内部有请求的所有的数据->req.query 2)params传参 1.需要提前声明占位符 2.读取方式:req.params 3.params的key来源于声明占位符时候(:后面的内容) 2.POST 1)query传参-> url?key=value&key2=value2 ->req内部有请求的所有的数据->req.query 2)params传参 1.需要提前声明占位符 2.读取方式:req.params 3.params的key来源于声明占位符时候(:后面的内容) 3)body(请求体传参) 1.读取方式:req.body->暂时不行->后面可以通过插件搞定 2.由于前两种数据拼接在URL中,所以数据量较小 请求体传参好处,数据量可以很大 3.上面两种传参方式是在URL中以明文传送,请求体传参会以密文传送,安全性较高 req.on("data",function(){ }) */ /* 编码格式 Node.js使用UTF-8 01->A 浏览器默认使用GBK->GB2312 01->a res的api 1)res.end(数据)->直接将数据返回给前端,不进行任何处理 2)res.send(数据)->根据数据内容,修改了Content-Type内部的编码格式,并返回 3)res.json(数据)->把数据转换成json字符串,根据数据内容,修改了Content-Type内部的编码格式,并返回 4)res.cookie()->用于设置cookie 5)res.set(配置对象)->用于设置响应头配置 6)res.status(状态码)->用于设置本次响应的状态码 */ app.get('/test/:id',function(req,res){ console.log('get /test'); // console.log(req.query) // console.log(req.query.username) // console.log(req.query) console.log(req.params) res.set({ "Content-Type":"text/html;charset=utf-8" }) res.status(404).end('请求失败') // res.send('haha哈哈') // res.json({name:"哈哈"}) }) app.post('/test',function(req,res){ console.log('post /test'); // console.log(req.query) // console.log(req.query.username) // console.log(req.params) // console.log(req.body) req.on("data",function(msg){ console.log(msg.toString()); }) res.end('xixi') }) app.listen("3001",function(err){ if(err){ console.log('服务器连接失败',err) }else{ console.log('服务器启动成功,启动于http://localhost:3001上') } })
中间件使用,需要下载connect-multiparty包
const express =require('express'); const path =require('path'); const multiparty = require('connect-multiparty'); const app = express(); /* 什么是中间件 数据类型:函数 作用: 1.扩展一些功能 2.修改请求头,响应头 3.执行下一个中间件 体现形式: 1)function(req,res,next){} 2)req->请求报文对象 3)res->响应报文对象 4)next->执行下一个中间件 中间件的特点: 1)所有的请求,无论地址,无论请求方式都会经过中间件 2)如果上一个中间件不放行,下一个不会执行,尽量不要在前面的中间件去返回数据,否则后面中间件可能会出问题 3)无论是路由,还是中间件,先匹配到谁,就先执行谁 内置中间件: 1)express.static(绝对文件夹路径)->它适用于配置静态文件路径 path模块 -> 当前文件绝对路径__dirname 当前端请求文件时,回去publish文件夹下寻找 express.static(path.resolve(__dirname,"./publish")) 2)express.json()->它适用于解析raw中的json请求体数据 3)express.urlencoded()->它适用于解析xxx-form-urlencoded中的请求体数据 第三方中间件: 包名:connect-multiparty 用处:适用于解析form-data格式的请求体参数 用法: 全局使用:app.use(multiparty()) 局部使用:app.post('/test',multiparty(),function(req,res){ console.log('body',req.body); res.send('post /test success') }) */ //自定义中间键 // app.use(function(req,res,next){ // console.log('hello world!!!') // res.send('你已成功到达中间件1') // // next(); // }) // app.use(function(req,res,next){ // console.log('hello world') // res.send('你已成功到达中间件2') // }) // console.log(__dirname) // console.log(path.resolve(__dirname,"./publish")); app.use(express.json()) .use(express.urlencoded({extended:true}))
// 直接在改文件夹下寻找资源
.use(express.static(path.resolve(__dirname,"./publish"))) // .use(multiparty()); app.get('/test',function(req,res){ console.log("你已成功到到/test") }) app.post('/test',multiparty(),function(req,res){ console.log('body',req.body); res.send('post /test success') }) app.post('/test1',function(req,res,next){ console.log('body',req.body); res.send('post /test success') next(); }) app.use(function(){ console.log('路由之后的中间键') }) app.listen("3001",function(err){ if(err){ console.log('服务器连接失败',err) }else{ console.log('服务器启动成功,启动于http://localhost:3001上') } })