NodeJS
一、nodeJS的概念
nodeJS是一个基于Chrome V8引擎(编译成原生机器码)的让JavaScript运行在服务器端的运行环境,它让JavaScript的触角伸到了服务器端。
二、nodeJS特性
- 单线程:NodeJS不会为每个连接客户客户创造一个新的线程,仅用一个线程
- 非阻塞IO:NodeJS在访问高IO操作后不会等待其完成,而是立即去执行其他代码,操作完成后会使用回调函数返回。保证高效的利用当前线程的cpu不造成硬件浪费
- 事件驱动:通过事件来驱动整个程序的进行。由于是单线程,所以把高io的操作移动到事件队列中等待完成,完成后通过回调函数的方式返回给线程来进行处理。
三、nodeJS模块
模块node中以模块来划分功能,一个js是一个模块,多个模块相互引用形成一个模块化式项目
模块优点
- 减少代码重复,提高利用率
- 划分功能,方便管理
- 方便使用第三方模块
(一) http模块 node重要的核心模块
- webServer : 方便地实现webServer服务器的创建
- 方法 : createServer(function(req,res){})进行服务器,创建listen来监听端口
代码示例
// 1.http模块引用
var http=require("http");
// 2.创建服务 req请求 res相应
http.createServer(function(req,res){
res.end("ok");
}).listen(3002)// 3.监听端口
(二) url模块 对当前的url进行相关操作
代码示例
var http=require("http");
var url=require("url");
http.createServer(function(req,res){
// 发送头标签(描述页面内容/字符集)
// 内容类型 Content-type
//指定内容类型 text/plain (文本类型) text/html( html类型)
res.writeHead(200,{"Content-type":"text/html;charset=utf-8"})
// res.end("你好");
// 返回一段html标签
// res.end("<h1>我是返回的内容</h1>")
// url模块 方法
var urlpath=url.parse(req.url)
// 阻止二此请求 favicon.ico
if(urlpath.pathname=="/favicon.ico"){
return;
}
// 完成路由 通过前台url传递过来的不同请求来执行不同的后台功能
// 1.先要判断命令是什么(url中得到)
if(urlpath.pathname=="/index"){
res.end("啊啊啊indexindex");
}else if(urlpath.pathname=="/home"){
res.end("呵呵homehome")
}
// url.parse()把url内容转换成对象
console.log(url.parse(req.url))
res.end()
}).listen(3001)
四、路由
- 路由:通过URL路径来区分不同的请求,从而找到不同的功能模块来进行执行。
- 路由练习
登录注册示例
var http=require("http");
var url=require("url");
http.createServer(function(req,res){
res.writeHead(200,{"Content-type":"text/html;charset=utf-8"});
// 解决二次请求
var pathurl=url.parse(req.url);
if(pathurl.pathname=="/favicon.ico"){
return;
}
// 路由
if(pathurl.pathname=="/login"){
res.end("您执行了登陆的后台功能");
}else if(pathurl.pathname=="/zhuce"){
res.end("您执行了注册的后台功能");
}else{
res.end("您的请求有误 请核实后在进行请求");
}
}).listen(3001)
五、express
express是一个简洁而灵活的node.js Web应用框架,提供了一系列强大特性和丰富的HTTP工具
功能
- 扩展了Web所需要的基本功能
- 丰富了HTTP工具
- 可以快速搭建一个网站
Express–路由
- 路由是根据url决定了那部分去响应客户端请求
- 在http请求中,可以通过路由提取出请求的url以及get/post参数
代码
var express=require("express");
// 初始化express
var app=express();
// 定义中间件(每一次接收到请求后都会先经过中间件)
app.use(function(req,res,next){
console.log("你好")
next()//下一步
})
// 创建服务
app.get("/",function(req,res){
res.send("aaaaaaa");
})
// 路由的使用
app.get("/index",function(req,res){
res.send("我是index")
})
app.get("/home",function(req,res){
res.send("我是home")
})
app.get("/post",function(req,res){
res.send("我是get的post")
})
app.get("/a*",function(req,res){
res.send("我是路径通配符选择的")
})
// 接受一个post请求
app.post("/post",function(req,res){
res.send("我是一个post请求")
})
app.listen(3000)
- app.post()接收post请求;
- app.all()方法让路由函数接收所有指定url的HTTP方法。
- 路径中使用通配符可以匹配所有例:app.get("/ab",function(req,res){}
中间件
中间件每次接收到请求都会被先调用的函数。
就是给一些特定功能添加的一个场所。所有路由都是用的内容可以放入中间件中
语法
app.use(function(req,res,next){
next() // 向后执行
})