Node.js搭建一个简单的服务器

Node.js的安装

了解Node.js模块系统

  • 利用Node.js搭建一个简单的服务器,需要先了解Node.js模块化系统,可以进行简单的Node.js内置模块操作
  • 点击查看Node.js模块化系统

服务器的搭建

一、创建一个Web服务器

注意

  • 引入http模块,创建http对象,监听端口
  • 创建服务器成功后,每次对文件的更改都需要服务器重启,也就是重新node + 文件名,因此推荐使用命令行工具自动重启,安装方式npm install nodemon -g 指令 nodemon + 文件名,自动重启,ctrl + c退出
  • res.end()必须要写,后端结束响应,如果不写页面将会一直加载
  • res.write()返回数据,如果数据是一段文字,需要res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})设置响应头,数据也可以是一段html代码
  • 监听的端口可以是1~65535,但是1024以下一般系统占用,不推荐使用

程序代码

//1.引入http模块
const http = require("http")

//2.创建http服务对象
//http.createServer(回调函数)

const app = http.createServer((req,res)=>{

	//req  request  请求    res  respond   响应

    //后端需要设置响应头 
    res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})
    
    
    res.write("你好!")
    // res.write(`<!DOCTYPE html>
    // <html lang="en">
    // <head>
    //     <meta charset="UTF-8">
    //     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    //     <title>Document</title>
    // </head>
    // <body>
    //     你好呀!大兄弟
    // </body>
    // </html>`)

    res.end() //后端需要结束响应  必须要写的
})

//3.监听端口
app.listen(8000)

运行

在这里插入图片描述
在这里插入图片描述

  • res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})设置响应头
    在这里插入图片描述
  • res.write()可以返回html代码
    在这里插入图片描述
  • ctrl + c退出
    在这里插入图片描述

二、静态资源托管

静态资源

  • xx.css xx.html xx.js xx.图片 xx.json xx.字体 等等都属于静态资源…本文中,我们简单的用几个html文件作为静态资源,你也可以放一些页面及更多的资源。
  • 前端资源请求方式
    • <a href=".."></a> <img src="..."/> location.href="..." body{ background:url(....)}
  • 后端资源读取
    • fs.readFile(文件名,[编码方式],回调(err,data));

注意

  • 引入httpfs,模块
  • 字符串index of方法, 用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配。返回-1表示不存在
  • try...catch 可以测试代码中的错误。try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。,在这里,使用它来让页面请求错误时跳转到事先写好的404页面

程序代码

  • 同级目录下放入静态资源
  • req.url,就是得到请求静态资源的地址
    在这里插入图片描述
//资源托管

//1.引入相应的原生模块、依赖
let http = require("http")
let fs = require("fs")

//2.创建http对象(服务器对象)
let app = http.createServer((req,res)=>
    //排除 /favicon.ico的请求  网页图标  自带的请求
    if(req.url.indexOf("/favicon.ico") === -1){
        //需要判断要读取的是动态资源(接口api)还是   静态资源
        if(req.url.indexOf("/api") !== -1){ //处理接口
            console.log("处理/api开头的动态接口",req.url)
        }else{ //处理静态资源 /index.html
            try {
            	//如果是  /   即直接请求localhost  相当于请求  index.html  默认是首页
            	//如果不是   得到  req.url    返回请求的  页面
                let path = req.url === "/" ? "/index.html" : req.url;
                let html = fs.readFileSync("./www"+path)
                //直接将html结果返回给浏览器
                res.write(html)    
            } catch (error) {
            //如果请求页面 出错  即页面不存在   就跳转到  404 页面
                let html = fs.readFileSync("./www/nopage.html")
                res.write(html)    
            }
        }
    }
    res.end() //必须写
})

//监听服务器
app.listen(8000)

运行

  • 默认是首页
    在这里插入图片描述
  • 请求某个页面
    在这里插入图片描述
    在这里插入图片描述
  • 如果请求地址错误,跳转到事先准备好的404错误页面
    在这里插入图片描述

三、简单接口的实现(简单服务器搭建完成)

注意

  • 引入http,fs,url,querystring内置模块

  • 处理地址栏数据,例如get,请求

    • req.url 抓取 get请求的数据 urlObj = url.parse(req.url,true)将数据转化为对象urlObj.query得到传递的数据
  • 处理非地址栏数据,例如post,请求

    • req.on('data',(chunk)=>{CHUNK==每次收到的数据buffer}每次在数据池中抓取一小片数据,知道数据被抓取完
    • req.on('end',()=>{ 接收完毕 切字符 querystring }) 当数据抓取完,接收完毕后,得到数据
    • 将数据转化为对象querystring.parse(data)

程序代码

//1.引入相应的原生模块、依赖
let http = require("http")
let fs = require("fs")
let url = require("url")
let querystring = require("querystring")

//2.实例化http对象(服务器对象)
let app = http.createServer((req,res)=>{
    //排除 /favicon.ico的请求
    if(req.url.indexOf("/favicon.ico") === -1){
        //需要判断要读取的是动态资源(接口api)还是静态资源
        if(req.url.indexOf("/api") !== -1){ //处理接口
            //处理地址栏的数据
            let urlObj = url.parse(req.url,true)
            console.log(urlObj.query)


            //非地址栏的数据
            let noAddressData = ""     //存放非地址栏的数据
            req.on("data",chunk=>{     //chunk代表抓取的一片数据,data事件内部会频繁的触发
                noAddressData += chunk
            })
            req.on("end",()=>{         //数据已经全部接受完毕
                console.log("非地址栏的数据:",querystring.parse(noAddressData))
            })
        }else{ 

			//处理静态资源的代码
            try {
                let path = req.url === "/" ? "/index.html" : req.url;
                let html = fs.readFileSync("./www"+path)
                //直接将html结果返回给浏览器
                res.write(html)    
            } catch (error) {
                let html = fs.readFileSync("./www/nopage.html")
                res.write(html)    
            }
        }
    }
    res.end() //必须写
})

//监听服务器
app.listen(8000)

运行

在这里插入图片描述
在这里插入图片描述

postman 测试接口软件

  • 在网上搜索下载安装
  • 点击进入官网
    在这里插入图片描述
  • 利用postman测试接口
  • 配置通过地址栏传递的数据
    在这里插入图片描述
  • 非地址栏传递的数据
    在这里插入图片描述
  • 点击send发送请求
    在这里插入图片描述
  • 得到传递的数据
    在这里插入图片描述
发布了13 篇原创文章 · 获赞 84 · 访问量 9181

猜你喜欢

转载自blog.csdn.net/k464746/article/details/104768467