Express+搭建服务器


搭建Node原生服务器

不借助任何第三方库,去搭建Node原生服务器

    1. 引入内置的http模块
let http = require('http')
//引入一个内置模块,用于解析key = value&key=value....这种形式的字符串为js中的对象
//编码形式:urlencoded编码形式的参数,叫做:查询字符串参数
//引入的qs是一个对象,该对象身上有很多用的方法,最具有代表性的:parse()
let qs = require('querystring')
    1. 创造一个“服务员”,创建服务对象
    2. 让服务员开始干活,获取客人点的菜单
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}`)  //提交内容
})
  1. request:请求对象,里面包含客服端给服务器的东西

  2. response:响应对象,里面包含服务器要返回给客户端的东西

    1. 指定服务器运行的端口号(绑定端口监听)
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)
})

IdLjIK.png

整体的一个搭建服务器代码


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)
})

得到的参数如图下所示

IsAi9S.png

IsAAXj.png

  • 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)
})

IsA1c4.png

  • 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)
})

输出结果:

IsVOcF.png


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'))

文章作者: Daniel Lin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Daniel Lin !
  目录