http模块
http模块是node重要的核心模块之一。 Node中http模块详解(服务端篇)

node官方中文文档:http://nodejs.cn/api/
先来看看最原生node写服务,简单的结构 webserver
// 1.引用http模块
var http=require("http");
// 2.创建webserver req:请求---发送 res:相应----接收
http.createServer((req,res)=>{
// 4.响应文档头 ---- 设置当前内容的字符编码和 相应的状态码
res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
// 5.返回数据
res.end("ok")
}).listen(3000) // 3.监听端口
4.1、路由
通过URL路径来区分不同的请求,从而找到不同的功能模块来进行执行。
通俗点的话,路由就是根据不同的请求,找到不同的代码完成处理。
我说:原生nodejs的路由分发,据我所见过的,挺麻烦的,性能也差。不过后期学到了express,以中间件的方式分发不同的路由,写起来感觉就舒服很多。
4.2、URL模块
对当前的url进行相关操作。
语法:
url.parse(req.url,true);
意为得到请求的url数据,第二个参数为true的话,就可以把当前url中的query页面数据转换成对象方便使用。
4.3、路由练习
两个页面登陆和注册 ,通过点击提交按钮, 后台根据url来调用不同的功能显示。
登录/注册页面布局:
<form action="http://127.0.0.1:3000/login" >
<input type="text" placeholder="登录用户名" name="username">
<input type="password" placeholder="登录密码" name="userpass">
<button>登录</button>
</form>
node后台服务文件:
var http=require('http');
var url=require('url');
http.createServer((req,res)=>{
res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
// 进行路由判断
var userUrl=url.parse(req.url,true)//通过url模块的parse方法可以将请求参数对象化,然后可以通过res.end返回前台
if(userUrl.pathname=="/favicon.ico") return;//这个小图标node自行请求的,屏蔽掉
// console.log(userUrl);//是一个Url对象,里一个属性query存放自动转化过来的的请求参数
if(userUrl.pathname=="/login"){
res.end("恭喜 "+userUrl.query.username+" 登录成功");
return;
}
if(userUrl.pathname=="/register"){
res.end("注册成功 您的账号是:"+userUrl.query.username);
return;
}
res.end("服务器仅连接成功,没有做任何操作");
}).listen(3000,()=>console.log("success"))
来看看请求结果:
express
express 第三方的框架 基于nodejs极简web框架 地位非常
先来看看最简单最基本的用法:
server.js
demoRou.js
Express官方网站 API接口文档:https://www.expressjs.com.cn/4x/api.html
5.1、什么是Express
express 是一个简洁而灵活的 node.js Web 应用框架, 提供了一系列强大的特性和丰富的 HTTP 工具。
功能:扩展了web所需要的基本功能,丰富了HTTP工具,可以快速搭建一个网站。
5.2、Express—安装
npm install --save express
5.3、Express—创建api接口
可以在该项目服务器文件目录下创建一个server.js文件 。
var express=require("express");
var app=express();
app.get("/user/login",function(req,res){
res.send({msg:"ok"})
})
app.get("/ser/home",function(req,res){
res.send({msg:"ok"})
})
var server=app.listen(3000)
解释:
- app.get() 接受get请求;
- app.post() 接受post请求;
- app.all() 方法让路由函数接收所有指定URL的HTTP方法。
路径中使用
*
通配符可以匹配所有,如:
app.get("/a*",function(req,res){}
匹配以a开头的所有url 。
5.4、Express—中间件
中间件:是每次接收到请求都会被先调用的函数,算是一个场所,给一些特定功能添加提供的。中间件中可以执行任何代码,比如更改请求和响应对象,结束请求响应周期等。中间件可以一次性放入多个回调函数,但有执行顺序,放在前面的先执行。中间件算是客户端对服务器请求的拦截器。
语法:
app.use([path,] callback [,callback ...])
将指定的一个或多个中间件函数安装在指定的路径上:当所请求路径的基数匹配时,将执行中间件函数。
官网: https://www.expressjs.com.cn/4x/api.html#app.use
// path默认值为“ /”,因此将为对应用程序的每个请求,执行不带路径安装的中间件。
app.use(function(req,res,next){
next() // 向后执行,跳转到下一个中间件
})
也可以把回调函数写在外面,或者模块化引入,然后通过app.usr(callback-name) 来应用中间件。
总之我理解的是,中间件就是一个任意的函数,然后可以通过app.use来应用这部分函数。
比如说我们自己做一个简单例子 ,自己做一个中间件:
然后导入我们暴露的中间件模块:
var myselfMW=require('./myself-middleware')
然后用
app.use(中间件)
在中间件中调用我们写的模块函数:由于在中间件的最后一位,所以最后执行。
扩展:
路由中间件比如 body-parser ,在给post传输数据时使用。
安装方式:如果用yarn安装的话,
yarn add body-parser
5.5、Express—路由
路由是根据url,决定了哪部分去响应客户端请求。
在HTTP请求中,可以通过路由提取出请求的URL以及GET/POST参数。
5.6、Express—路由创建
创建router文件夹,然后创建路由文件命名为userRouter.js 。
// 存放路由的文件
var express=require("express");
var router=express.Router()
// 设置路由
router.get("/login",function(req,res){
res.send({msg:"我是login"})
})
router.get("/zhuce",function(req,res){
res.send({msg:"我是zhuce"})
})
// 暴露路由
module.exports=router
5.7、Express—路由使用
server.js文件中,引用路由 。
var express=require("express");
var app=express();
// 引用路由文件
var userRouter=require("./userRouter");
// 中间件中使用路由
app.use("/user",userRouter)
// 请求是localhost:3000/user/路由文件中的地址
app.listen(3000)
我说:跟直接用express写请求,怎么说呢,感觉变化就是,把请求单独封装起来了,然后在主服务文件中引用路由。这个server.js主服务文件就像是一个控制器,可以控制引用哪个路由。
5.8、静态资源文件 —webserver
使用中间件配合
app.use(express.static(path.join(__dirname, “文件夹名”)));
5.9、express\中间件\mongoose\连接MongoDB 联合小栗子
数据库服务文件:index.js
// 封装数据库连接的内容
var mongoose=require("mongoose")
mongoose.connect("mongodb://localhost:27017/某数据库名",{ useNewUrlParser: true ,useUnifiedTopology: true})
var db=mongoose.connection
db.on("err",console.error.bind(console,"数据库连接失败"))
db.on("open",(ok)=>{
console.log("数据库连接成功")
})
var schemauser=new mongoose.Schema({
name:String,
age:Number,
sex:Boolean
})
var col=mongoose.model("集合名",schemauser)//这个库的名字尽量都加s,因为不加,系统会默认给加上
module.exports=col
中间件:user.js
var express=require("express");
var router=express.Router()
var col=require("../db/index")
router.get("/find",(req,res)=>{
col.find().then((ok)=>{
console.log(ok)
res.send({msg:"查询的数据",data:ok})
})
})
router.get("/insert",(req,res)=>{
// 执行新增操作
var datacol= new col({
name:"嘻嘻",
age:19,
sex:false
})
// 开始插入
datacol.save().then((ok)=>{
console.log(ok)
})
res.send("我是新增的路由")
})
module.exports=router
node后台服务文件:server.js
var express=require("express");
var app=express()
app.use("/",(req,res,next)=>{
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE,OPTIONS');
next()//必须要加
})
// 引入路由文件
var ruser=require("./router/user")
// 使用中间件调用路由
app.use("/user",ruser)
app.listen(3000)
模板引擎 EJS
模板引擎 EJS–配置和使用
下载 :npm install --save ejs
app.set()设置了模版文件夹的路径
配置:
app.set("view engine","ejs") //让express 对模板进行识别 认识ejs
app.set("views",__dirname+"/ejs")//设置模板的相对路径(放置到ejs的文件夹中)
创建模板文件:在指定文件夹中创建 创建以
.ejs
结尾的文件来进行编写模板。
模板引擎 EJS—模板编写
ejs文件内的内容和html相同 ,可以写一个基本html页面框架放置当中。
1、插入数据:ejs的数据源是在
render("文件名",{数据})
中进行传递的
app.get("/",function(req,res){
res.render("文件名",{
obj:{
name:"xixi"
}
})
})
2、使用数据
<%= 数据 %>