搭建Node原生服务器
不借助任何第三方库,去搭建Node原生服务器
- 引入内置的http模块
let http = require('http')
//引入一个内置模块,用于解析key = value&key=value....这种形式的字符串为js中的对象
//编码形式:urlencoded编码形式的参数,叫做:查询字符串参数
//引入的qs是一个对象,该对象身上有很多用的方法,最具有代表性的:parse()
let qs = require('querystring')
- 创造一个“服务员”,创建服务对象
- 让服务员开始干活,获取客人点的菜单
let server = http.createServer(function(request,response){
let params = request.url.split('?')[1] //获取客户端袖带过来的urlencoded:name=zhangsan&age=18
let objParams = qs.parse(params) //{name:'zhangsan',age:18}
let {name,age} = objParams //解构赋值
response.setHeader('content-type','text/html;charset=utf-8') //设置响应头
response.end(`你好${name},你的年龄是${age}`) //提交内容
})
request:请求对象,里面包含客服端给服务器的东西
response:响应对象,里面包含服务器要返回给客户端的东西
- 指定服务器运行的端口号(绑定端口监听)
server.listen(3000,function(err){
if(!err) console.log('服务器启动成功了')
else console.log(err)
})
express框架
- 引入express
const express = require('express')
- 创建app服务对象
const app = express()
- 配置路由—对请求的url进行分类,服务器根据分类决定交给谁去处理
根据路由定义的顺序(写代码的顺序),依次定义好路由,随后放入一个类似数组的结构,当有请求时,依次取出匹配,若匹配成功,不再继续匹配
//根路由
app.get('/',function(request,response){
response.send('我是主页')
})
//一级路由
app.get('/meishi',function(request,response){
response.send('我是美食页面1')
})
//一级路由 该路由不进行匹配
app.get('/meishi',function(request,response){
response.send('我是美食页面2')
})
- 指定服务器运行的端口号
app.listen(3000,function(err){
if(!err) console.log('服务器启动成功了')
else console.log(err)
})
整体的一个搭建服务器代码
const express = require('express')
const app = express()
app.get('/',function(request,response){
response.send('我是主页')
console.log(request.query)
})
app.listen(3000,function(err){
if(!err) console.log('服务器启动成功了')
else console.log(err)
})
request对象的属性
request.query
获取查询字符串参数(query参数),拿到的是一个对象
let express = require('express')
let app = express()
app.get('/',function(request,response){
console.log(request.query)
response.send('ok')
})
app.listen(3000,function(err){
if(!err) console.log('ok')
else console.log(err)
})
得到的参数如图下所示
request.params
获取get请求参数路由的参数,拿到的是一个对象
let express = require('express')
let app = express()
app.get('/demo/:id',function(request,response){
let {id} = request.params
response.send(`我是${id}`)
})
app.listen(3000,function(err){
if(!err) console.log('ok')
else console.log(err)
})
request.body
获取post请求体,拿到的是一个对象,要借助一个中间件
request.get(xxx)
let express = require('express')
let app = express()
app.get('/',function(request,response){
console.log(request.query)
console.log(request.get('Host'))
console.log(request.get('Referer'))
response.send('ok')
})
app.listen(3000,function(err){
if(!err) console.log('ok')
else console.log(err)
})
输出结果:
response对象属性
response.send()
:给浏览器做出一个响应
reponse.end()
:给浏览器做出一个响应
response.download
:告诉浏览器下载一个文件
response.sendFile()
:给浏览器下载一个文件
response.redirect()
:服务器告诉浏览器重定向
response.redirect('http://www.baidu.com')
response.set(header,value)
:自定义响应头内容
response.get(key)
:获取响应头指定key对应的value
res.status(code)
:设置响应状态码
全局应用级中间件
aoo.use((request,response,next)=>{
//response.send('')
//1.过滤一些合法的请求
next() //放行
})
在express中,定义路由和中间件的时候,根据定义的顺序,将定义的每一个中间件或路由,放在一个类似与数组的容器中,当请求过来时,依次从容器中取出中间件和路由,进行匹配,如果匹配成功,将由该路由或中间件处理,如果全局中间件写在最开始的位置,name就是请求的“第一扇门”
对于服务器来说,依次请求,只有一个请求对象民和一个响应对象,其他任何的request和response都是对二者的引用
- 图片防盗链
app.use((request, response, next) => {
if (request.get('Referer')) {
let mini = request.get('Referer').split('/')[2]
if (mini === '127.0.0.1:5500') {
next()
} else {
response.sendFile(__dirname +'/pubilc.error.png')
}
} else {
next()
}
})
第二种函数全局应用级中间件用法
const e = require('express')
const express = require('express')
const app = express()
function demo(request, response, next) {
if (request.get('Referer')) {
let mini = request.get('Referer').split('/')[2]
if (mini === '127.0.0.1:5500') {
next()
} else {
response.sendFile(__dirname + '/pubilc.error.png')
}
} else {
next()
}
}
app.get('/', (request, response) => {
response.send('ok')
})
app.get('/demo', (request, response) => {
console.log(request.query)
response.send('ok2')
})
app.get('/picture',demo, (request, response) => { //只在picture路由使用
response.sendFile(__dirname + '/public/demo.jpg')
})
app.listen(3000, function (err) {
if (!err) console.log('已经启动')
else console.log(err)
})
优点:更加灵活,不是第一扇门,可以在任何地方使用
第三方中间件
npm add body-parser
用于解析post参数
引入:
const bodyParser = require('body-parser')
用法:
app.use(bodyParser.urlencoded({extended: true}))
解析post请求请求体中所携带的unrlencoded编码形式的参数为一个对象,随后挂载到request对象
- 使用内置中间件去暴露静态资源–一次性把你所指定的文件内的资源全部交出去
app.use(express.static(__dirname + '/public'))