node自定义模块学习笔记1.1

本文介绍了如何使用Node.js创建一个web服务器,包括处理HTTP请求、响应内容及优化URL路径。同时,讲解了Node.js中的模块化概念,展示了如何编写和导出自定义模块,以及模块内部成员的访问方式。通过示例代码,读者可以了解到在CMD中运行服务器并查看相关信息的操作流程。
摘要由CSDN通过智能技术生成

1.使用node创建web服务器。

//导入需要的模块
// 声明一个变量接收了http处理web服务模块
const http = require("http");
// 声明一个变量接收了fs处理文件系统模块
const fs = require("fs");
// 声明一个变量接收了path处理路径模块
const path = require("path");
//自定义模块就是自己定义的js文件,在node调用,自定义模块在调用的时候需要写路径,js后缀名可以省略
//声明一个变量接收了自定义模块,接收过来的是自定义模块中通过module.exports指向的对象{}
// 我们导入的自定义模块永远以模块内部module.exports指向的对象为准
const m1 = require("./m1.js");
console.log(m1);

//http操作创建web服务
//声明变量server接收http模块方法中的web服务器实例
const server = http.createServer();
//为web服务器实例的on对象绑定一个request事件,然后设置一个处理函数可以拿到参数:req,res
//req是客户端请求的对象的形参,里面包含客户端相关的属性和数据
//res是响应对象,在客户端请求后服务器通过res响应数据或属性给客户端
server.on("request", (req, res) => {
  //接收用户端请求req中的url地址
  const url = req.url;

  //把客户端请求过来的URL地址映射为具体文件的存放路径
  //原理就是拼接用户请求过来的req里的url地址
  //const fpath = path.join(__dirname, url);

  // 优化客户端请求的url路径,原理就是解决用户请求的url地址太长这样很不方便,我们需要优化减短
  //先定义一个空的变量
  let fpath = "";
  // 如果客户端请求的url地址是/,那么就拼接我们想要优化的url地址
  //这样客户端请求的url地址是/,实际上我们在/前面拼接了url地址,实现了客户端只需要请求/就可以访问到设置好的路径
  if (url === "/") {
    //判断用户请求的url地址为/,则拼接想让用户访问的路径
    fpath = path.join(__dirname, "./clock/index.html");
  } else {
    // 判断用户请求的url不是/,则拼接用户请求的url地址到需要优化的路径
    fpath = path.join(__dirname, "./clock", url);
  }

  // 然后调用fs文件处理模块根据上面拼接的url获取文件判断是否获取成功则响应到客户端
  //根据映射过来的文件路径读取文件内容
  fs.readFile(
    fpath,
    /*"utf8", 发现取消utf8后图片才能正常显示*/ (err, dataStr) => {
      //判断是否读取失败,失败则通过res响应错误的信息404
      if (err) return res.end("404 请求的页面不存在...");
      //判断没有读取失败则响应读取的内容到客户端
      res.end(dataStr);
    }
  );

  //设置默认的响应内容为:404 没有找到请求的内容
  //let content = "<h1>404 没有找到请求的内容...</h1>";

  //页面判断操作
  //判断用户请求的url是否为/或index.html首页
  //判断用户请求的url是否为about.html首页
  //if (url === "/" || url === "/index.html") {
  // content = "<h1>首页</h1>";
  //} else if (url === "/about.html") {
  //  content = "<h1>关于页</h1>";
  //}

  //响应操作
  //接收客户端请求req中的method类型
  const method = req.method;
  //接收客户端请求过来的url地址与method类型
  //${}是一种占位符
  const str_url = `正在请求的url地址是:${url}`;
  const str_method = `\n正在请求的method类型是: ${method}`;

  //调用res中的setHeader方法解决响应中文数据到客户端乱码的问题
  //第一个参数为响应头:"Content-Type"值是:"text/html;charset=utf-8"
  //但是在响应html文件时使用后丢失html里的css与js
  //res.setHeader("Content-Type", "text/html; charset=utf-8");

  //在控制台输出客户端请求的url地址和method类型
  console.log(str_url, str_method);
  console.log(`本次响应到客户端的路径:${fpath}`);
  //调用res.end()方法:向客户端发送指定的数据内容,并结束这次请求的处理过程
  //向客户端发送str的文本内容
  //根据客户端请求的数据响应对应的html内容
  //res.end(`服务器响应过来的数据:<br>${str_url}<br>${str_method}<br>${content}`);

  console.log("服务器运行正常...");
});

//启动服务器
//cmd路径命令:cd空格加当前文件路径回车切换
//node空格加当前文件名回车启动服务器
server.listen(9999, () => {
  console.log("web服务器已启动...");
  //在控制台输出可以访问当前wbe服务的域名IP和端口
  console.log("访问该服务器的IP域名和端口为: http://*********.com:9999");
});

2.自定义的模块其实是一个js文件,让这个文件可以被node导入使用,就是模块化。

//这是一个自定义的模块,为node提供
//作用域:模块内定义的成员(这里指变量等等...)无法被外界访问,只能在模块内使用
console.log("加载自定义模块:m1");
const age = 20;

//module对象可以让外界访问到当前模块内的成员
//模块化遵循的是CommonJS规范,每个模块的module变量是一个对象代表当前模块,module里的exports属性是一个对外接口
// Node加载模块时其实都是加载module.exports属性
//下方输出module对象到在cmd命令窗口可以看见module对象详细
console.log(module);

//因为module.exports的写法比较复杂,官方优化后我们只需要写后面的exports即可
console.log(exports === module.exports); //打印到控制台查看两者默认的状态下是否相同,相同则结果为真
//下面使用module.exports向外界提供模块内的变量成员使用,默认是空的对象{}
//相当是挂载一个属性
exports.username = "大哥大";
//下面使用module.exports向外界提供模块内的处理函数方法成员使用
//下方单独使用了exports其实还是module.exports只是写法简单化而言
exports.sayHello = function () {
  console.log("二狗子");
};
//下面使用module.exports定义一个属性接收模块内的成员向外界提供模块内已经定义过的成员
exports.age = age;
//下方让module.exports指向新的对象,之前指向的旧对象会消失
//发现单独使用exports无法实现指向全新的对象,需要加全module.exports
//因为node导入模块时永远以module.exports指向的对象为准
//下面module.exports指向了新的的空间,之前的所有旧指向都被掐断了
//但是单独使用exports玩法覆盖module.exports开辟新的空间,所以已经有一个空间的情况下单独使用exports无法实现指向全新的对象
//因为不管是谁开辟了新的空间,node导入模块时永远以module.exports开辟的空间为准
exports = {
  nickname: "二哥",
  sayHi() {
    console.log("你好");
  },
};
//既然都以module.exports指向为准,那我们用module.exports指向exports那么exports就都能被指向
module.exports = exports;
//我们在当前module.exports指向的空间挂载一个成员
module.exports.age = "红楼梦";
//我们在当前module.exports指向的空间使用exports挂载一个成员
//在一个模块中module.exports和exports建议只使用一个,这样防止带来很多的痛苦混乱
exports.age_1 = "西游记";

3.在cmd命令窗口执行node文件查看相关信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值