IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 使用Node.js创建服务器,使用nodejs请求的配置 -> 正文阅读

[JavaScript知识库]使用Node.js创建服务器,使用nodejs请求的配置

1.node.js 创建服务器的三大步骤(四大步骤)

??????1.引入HTTP协议;

??????2.根据http协议创建服务器:服务器需要遵守http协议规范;

??????3.添加端口监听,用户只有发起针对这个服务器指定的端口请求才进行处理;

?????4.添加对用户请求的监听,监听到用户请求就会调用传入的回调函数进行处理;

????????req:与请求相关的操作都找req;

????????res:与响应相关的操作都找res;

? ?注意:启动服务器指令为:node 当前js文件路径(页面输入服务器地址)?

// 1.引入HTTP协议
const http = require('http')
// 2.根据http协议创建服务器
let server = http.createServer()
// 3.添加端口的监听
server.listen(3001, () => {
  console.log('服务器开启了,地址是:  http://127.0.0.1:3001')
})
// 4.添加用户请求的监听,如果有用户请求就进行处理
server.on('request', (req, res) => {
  // 响应一些内容到客户端:只能响应字符串格式--json格式
  // res.end:end可以将内容响应回客户端,是res的内置方法
  res.end('hello world')
})

2.响应页面资源文件

? ? ?1. 所有资源在服务器端本质都是文件,所以响应页面资源的本质就是读取文件内容响应;

? ? ?2. 可以使用 readFile来读取文件,并将其内容返回;

????????readFile:有三个参数(文件路径,文件格式,回调函数)

? ? ?3.样式文件可以使用 indexOf来进行判断;

server.on('request', (req, res) => {
  console.log(req.url)

  if (req.url == '/') {
    // 所有资源在服务器端本质都是文件,所以响应页面资源的本质就是读取文件内容响应
    fs.readFile('./views/index.html', (err, data) => {
      if (err) {
        res.end('err')
      } else {
        res.end(data)
      }
    })
  }
  // 处理css资源文件,使用indexOf进行判断
  else if (
    req.url.indexOf('/css/') != -1 ||
    req.url.indexOf('/js/') != -1 ||
    req.url.indexOf('/images/') != -1
  ) {
    fs.readFile(__dirname + req.url, (err, data) => {
      if (err) {
        res.end('err')
      } else {
        res.end(data)
      }
    })
  }
})

3.node 对请求做出相应相应

? ?1.添加一个接口,能够相应相应的数据,请求的规则由自己定义;

? ?2.判断发起的什么请求,请求有没有相应的参数需要传递;

3.1:这是个get请求-可以带参和无参(返回所有数据);

? ? ? 1.判断请求和请求路径是否正确;

? ? ? 2.正确后配置防止乱码?res.setHeader("Content-Type", "application/json;charset=utf-8");

? ? ? 3.使用 queryString.parse:将key=value&key1=value1这种格式的参数字符串转换为{key=value,key1:value1},方便用于判断;

? ? ? 4.对其做出相应数据转换并返回即可;

 else if (req.method == "GET" && req.url.indexOf("/getList") != -1) {
    fs.readFile("./Testdata/data.json", "utf-8", (err, data) => {
      if (err) {
        res.end("err");
      } else {
        res.setHeader("Content-Type", "application/json;charset=utf-8");
        // 1.先去获取参数:get方式的参数在_url__中拼接
        // console.log('req.url--', req.url)
        // let search = req.url.split('?')[1]
        // queryString.parse:将key=value&key1=value1这种格式的参数字符串转换为{key=value,key1:value1}
        // console.log('req.url--', queryString.parse(search))
        let params = queryString.parse(req.url.split("?")[1]);
        // 2.如果有参数:根据参数实现数据的过滤--查询
        // heroName:由于后台处理的时候,只会获取heroName名称的参数,说明前端发起请求的时候一定要传递这个名称的参数
        if (params.heroName) {
          // 1.获取--字符串
          // 2.转换--js数组
          let arr = JSON.parse(data);
          // 3.数据操作--增加删除修改和查询
          arr = arr.filter(function (value) {
            return value.cname.indexOf(params.heroName) != -1;
          });
          // 4.转换--json字符串
          // 5.写入|存储|响应
          res.end(JSON.stringify(arr));
        }
        // 3.如果没有参数
        else {
          res.end(data);
        }
      }
    });
  }

? ??

3.2:post请求-进行数据新增

? ? ? 1.这个需要注意的是post 参数需要使用两个事件;

? ? ? 2. req.on('data',(chunk)=>{}):post方式支持传递大容量的参数,但是服务器为了提升性能,要求大容量的参数分批(块)传递,每次接收到一块数据,就会触发data事件,chunk就是本次触发所接收到的参数,所以我们要定义一个变量拼接每次接收到的参数数据;

? ? ? 3.?req.on('end',()=>{}):当所以有参数都接收完毕,就会触发end事件,在end事件的回调函数中进行下一步处理;

  // 添加一个接口,能够实现英雄数据的新增
  // post /addHero   {cname:'' ,skin_name:''} id由我们后台生成
  else if (req.method == "POST" && req.url == "/addHero") {
    // 接收post方式传递的参数,最终需要一个对象
    let str = "";
    req.on("data", (chunk) => {
      str += chunk;
    });
    req.on("end", function () {
      // { cname: 'aaa', skin_name: 'bbbb' }
      let newHero = JSON.parse(str);
      // 先读取原始数据文件
      fs.readFile("./Testdata/data.json", "utf-8", (err, data) => {
        if (err) {
          res.end(JSON.stringify({ code: 1, message: "添加失败" }));
        } else {
          // 转换为js数组
          let arr = JSON.parse(data);
          // 生成id
          newHero.id = arr.length > 0 ? +arr[arr.length - 1].id + 1 : 1;
          // 数据的添加
          arr.push(newHero);
          // 再进行写入---转换为字符串
          fs.writeFile("./Testdata/data.json", JSON.stringify(arr), (err) => {
            if (err) {
              res.end(JSON.stringify({ code: 1, message: "添加失败" }));
            } else {
              res.end(JSON.stringify({ code: 0, message: "添加成功" }));
            }
          });
        }
      });
    });
  }

? ? ??

总结:以上就是 node 简单搭建服务器和页面资源响应加上两个请求的介绍

下面是所有代码的集合-可以直接拷贝去看下代码如何运行的,这里还需要创建一个文件用来存放所有数据-用于增删改查-我这里的文件叫做(Testdata/data.json)

const http = require("http");
const fs = require("fs");
const queryString = require("querystring");
const server = http.createServer();
server.listen(3002, () => {
  console.log("http://127.0.0.1:3002");
});
server.on("request", (req, res) => {
  if (req.url == "/") {
    fs.readFile("./views/index.html", (err, data) => {
      if (err) {
        res.end("err");
      } else {
        res.end(data);
      }
    });
  }

  else if (
    req.url.indexOf("/css/") != -1 ||
    req.url.indexOf("/js/") != -1 ||
    req.url.indexOf("/images/") != -1
  ) {
    // fs.readFile('.' + req.url, (err, data) => {
    fs.readFile(__dirname + req.url, (err, data) => {
      if (err) {
        res.end("err");
      } else {
        res.end(data);
      }
    });
  }

  else if (req.method == "GET" && req.url.indexOf("/getList") != -1) {
    fs.readFile("./data/data1.json", "utf-8", (err, data) => {
      if (err) {
        res.end("err");
      } else {
        res.setHeader("Content-Type", "application/json;charset=utf-8");
        let params = queryString.parse(req.url.split("?")[1]);
        if (params.heroName) {
          let arr = JSON.parse(data);
          arr = arr.filter(function (value) {
            return value.cname.indexOf(params.heroName) != -1;
          });
          res.end(JSON.stringify(arr));
        }
        else {
          res.end(data);
        }
      }
    });
  }

  else if (req.method == "POST" && req.url == "/addHero") {
    let str = "";
    req.on("data", (chunk) => {
      str += chunk;
    });
    req.on("end", function () {
      let newHero = JSON.parse(str);
      fs.readFile("./data/data1.json", "utf-8", (err, data) => {
        if (err) {
          res.end(JSON.stringify({ code: 1, message: "添加失败" }));
        } else {
          let arr = JSON.parse(data);
          newHero.id = arr.length > 0 ? +arr[arr.length - 1].id + 1 : 1;
          arr.push(newHero);
          fs.writeFile("./data/data1.json", JSON.stringify(arr), (err) => {
            if (err) {
              res.end(JSON.stringify({ code: 1, message: "添加失败" }));
            } else {
              res.end(JSON.stringify({ code: 0, message: "添加成功" }));
            }
          });
        }
      });
    });
  }
});

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:34:49  更:2022-08-06 10:37:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 12:44:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码