nodejs学习week01

news2025/8/10 11:18:55

说明:学习nodejs之气那应该掌握html,css,JavaScript等前端基础技术 

目录

一、什么是nodejs

二、nodejs的内部模块

1.fs文件系统模块

2.path路径模块

3.http服务器模块

三、module.exports对象

四、时间格式化

1.使用JavaScript的方法

2.使用moment对时间进行格式化

五、案例 实现clock时钟的web服务器


前言:从今天开始我们一起来学习nodejs相关知识。

 

一、什么是nodejs

nodejs 是一个基于Chrome V8引擎的JavaScript运行环境

二、nodejs的内部模块

1.fs文件系统模块

readFile('文件路径绝/相对',‘字符集’,function(读取错误,读取成功{})):读取文件内容

 writeFile(‘路径’,‘内容’,function(err){})

  

e.g:学上成绩转换

const fs = require('fs')

//读取文件
//可以提供相对路径,也可以提供绝对路径(node会运行当下路径进行拼接)
fs.readFile('./files/成绩.txt','utf8',function(err,dataStr){
    //判断是否能读取成功
    if(err){
        return console.log("读取失败"+err.message)
    }

    //将原数组按照空格分开
    const arrOld = dataStr.split(' ')
    console.log(arrOld)
    console.log('读取成功'+dataStr)

    //用:替换=并且加入到新数组中
    const arrNew = []
    arrOld.forEach(item => {
        arrNew.push(item.replace('=',': '))
    });
    console.log(arrNew)

    //向数组中新增空格换行符号
    const newStr = arrNew.join('\r\n')
    console.log(newStr)

})

 

 

2.path路径模块

 

 

3.http服务器模块

创建基本的服务器

const http = require('http')

const serever = http.createServer()

//为服务器实例绑定request事件
serever.on('request',function(req,res){
    console.log('Someone visit our web server')
})

//启动服务器监听(启动服务器)
serever.listen(8080,function(){
    console.log('server running at http://127.0.0.1:8080')
})

req请求

//req请求对象

//req:访问与客户端有关的数据和属性
//req.url:客户端请求的URL地址
//req.method:客户端的method请求类型

const http = require('http')
const server = http.createServer()

//req请求对象
server.on('request',req=>{
    const url = req.url
    const method = req.method
    //输出
    const str = `Your request url is ${url}, and reqyest method is ${method}` //反引号
    console.log(str)
})

server.listen(8080,()=>{
    console.log('server running at http://127.0.0.1:8080')
})

res响应:



const http = require('http')
const server = http.createServer()

//req请求对象
server.on('request',(req,res)=>{
    const url = req.url
    const method = req.method
    //输出
    const str = `Your request url is ${url}, and reqyest method is ${method}` //反引号
    console.log(str)

    //调用res.end方法向客户端响应一些数据
    res.end(str)
})

server.listen(8080,()=>{
    console.log('server running at http://127.0.0.1:8080')
})

三、module.exports对象

向外暴露模块中的属性和方法(相当于私有的被公开)

自定义模块:

console.log('加载了用户自定义模块')

//向module.exports对象上挂载username属性
module.exports.username = 'zz'
//向module》exports上挂在
module.exports.sayHello = function(){
    console.log("hello")
}

module.exports = {
    nickname:'小黑',
    sayHi(){
        console.log('hi')
    }
}

 test


//加载用户模块通过路径
const a = require('./11.加载用户自定义模块')
console.log(a)

 四、时间格式化

1.使用JavaScript的方法

dateformat.js

//定义格式化时间的方法
function dateFormat(dtStr){
    const dt = new Date(dtStr)

    //年
    const y = dt.getFullYear()
    //月
    const m = padZero(dt.getMonth()+1)
    //日
    const d = padZero(dt.getDay())

    //时
    const hh = padZero(dt.getHours())
    //分
    const mm = padZero(dt.getMinutes())
    //秒
    const ss = padZero(dt.getMilliseconds())

    return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
    //`YYYY-MM-DD HH:mm:ss`
}

//添加补0函数
function padZero(n){
    return n>9?n:'0'+n
}

//向外暴露供外界使用
module.exports = {
    dateFormat
}

test

//导入自定义格式化时间模块
const time = require('./17.dateformat')

//调用方法进行时间的格式化
const dt = new Date()
//输出
const newDt = time.dateFormat(dt)
console.log(newDt)

2.使用moment对时间进行格式化

//1.导入moment包
const moment = require('moment')

const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)

五、案例 实现clock时钟的web服务器

文件目录:

 

 

 clock.html


<!doctype html>
<html>
<head>
 <meta charset="UTF-8">
 <link rel='stylesheet' href='./clock.css' />
 <title>时钟</title>
</head>
<body>
 <div class="clock" id="clock">
  <!-- 原点 -->
  <div class="origin"></div>
 
  <!-- 时分秒针 -->
  <div class="clock-line hour-line" id="hour-line"></div>
  <div class="clock-line minute-line" id="minute-line"></div>
  <div class="clock-line second-line" id="second-line"></div>
 
  <!-- 日期 -->
  <div class="date-info" id="date-info"></div>
  <!-- 时间 -->
  <div class="time-info" >
   <div class="time" id="hour-time"></div>
   <div class="time" id="minute-time"></div>
   <div class="time" id="second-time"></div>
  </div>
 </div>
<script type='text/javascript' src='./clock.js'></script>
</body>
</html>

clock.css

*{
    margin:0;
    padding:0;
   }
   /* 外面的大盒子 */
   .clock{
    width:400px;
    height:400px;
    border:10px solid #333;
    box-shadow: 0px 0px 20px 3px #444 inset;
    border-radius:50%;
    position:relative;
    margin:5px auto;
    z-index:10;
    background-color:#f6f6f6;
   }
   /* 时钟数字 */
   .clock-num{
    width:40px;
    height:40px;
    font-size:22px;
    text-align:center;
    line-height:40px;
    position:absolute;
    z-index:8;
    color:#555;
    font-family:fantasy, 'Trebuchet MS';
   }
   .em_num{
    font-size:28px;
   }
   /* 指针 */
   .clock-line{
    position:absolute;
    z-index:20;
   }
   .hour-line{width:100px;
    height:4px;
    top:198px;
    left:200px;
    background-color:#000;
    border-radius:2px;
    transform-origin:0 50%;
    box-shadow:1px -3px 8px 3px #aaa;
   }
   .minute-line{
    width:130px;
    height:2px;
    top:199px;
    left:190px;
    background-color:#000;
    transform-origin:7.692% 50%;
    box-shadow:1px -3px 8px 1px #aaa;
   }
   .second-line{
    width:170px;
    height:1px;
    top:199.5px;
    left:180px;
    background-color:#f60;
    transform-origin:11.765% 50%;
    box-shadow:1px -3px 7px 1px #bbb;
   }
   /* 原点 */
   .origin{
    width:20px;
    height:20px;
    border-radius:10px;
    background-color:#000;
    position:absolute;
    top:190px;
    left:190px;
    z-index:14;
   }
   
   /* 日期 时间 */
   .date-info{
    width:160px;
    height:28px;
    line-height:28px;
    text-align:center;
    position:absolute;
    top:230px;
    left:120px;
    z-index:11;
    color:#555;
    font-weight:bold;
    font-family:'微软雅黑';
   }
   .time-info{
    width:92px;
    height:30px;
    line-height:30px;
    text-align:center;
    position:absolute;
    top:270px;
    left:154px;
    z-index:11;
    background-color:#555;
    padding:0;
    box-shadow:0px 0px 9px 2px #222 inset;
   }
   .time{
    width:30px;
    height:30px;
    text-align:center;
    float:left;
    color:#fff;
    font-weight:bold;
   }
   #minute-time{
    border-left:1px solid #fff;
    border-right:1px solid #fff;
   }
   
   /* 刻度 */
   .clock-scale{
    width:195px;
    height:2px;
    transform-origin:0% 50%;
    z-index:7;
    position:absolute;
    top:199px;
    left:200px;
   }
   .scale-show{
    width:12px;
    height:2px;
    background-color:#555;
    float:left;
   }
   .scale-hidden{
    width:183px;
    height:2px;
    float:left;
   }

 clock.js

(function(){//自己调用自己
    //页面加载完成时运行,将实参传给下面的函数
    window.onload=initNumXY(200, 160, 40,40);
    //获取指针的时分秒
    var hour_line = document.getElementById("hour-line");
    var minute_line = document.getElementById("minute-line");
    var second_line = document.getElementById("second-line");
    var date_info = document.getElementById("date-info");
    var week_day = [
     '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'
    ];
    //获取时间的时分秒
    var hour_time = document.getElementById("hour-time");
    var minute_time = document.getElementById("minute-time");
    var second_time = document.getElementById("second-time");
    //在底部调用函数
    function setTime(){
     var this_day = new Date();
     //如果时间大于12小时,就减去12小时
     var hour = (this_day.getHours() >= 12) ?
       (this_day.getHours() - 12) : this_day.getHours();
     var minute = this_day.getMinutes();
     var second = this_day.getSeconds();
     //定义小时转的角度
     var hour_rotate = (hour*30-90) + (Math.floor(minute / 12) * 6);
     //获取4位数的年份
     var year = this_day.getFullYear();
     //获取月份,如果小于10,要加0
     var month = ((this_day.getMonth() + 1) < 10 ) ?
       "0"+(this_day.getMonth() + 1) : (this_day.getMonth() + 1);
     //获取天数,小于10 加上0
     var date = (this_day.getDate() < 10 ) ?
       "0"+this_day.getDate() : this_day.getDate();
     //获取星期
     var day = this_day.getDay();
     //获取要转的度数
     hour_line.style.transform = 'rotate(' + hour_rotate + 'deg)';
     minute_line.style.transform = 'rotate(' + (minute*6 - 90) + 'deg)';
     second_line.style.transform = 'rotate(' + (second*6 - 90)+'deg)';
     //写入年月日
     date_info.innerHTML = 
      year + "-" + month + "-" + date + " " + week_day[day];
     //在框框内写入时分秒
     hour_time.innerHTML = (this_day.getHours() < 10) ?
       "0" + this_day.getHours() : this_day.getHours();
     minute_time.innerHTML = (this_day.getMinutes() < 10) ? 
       "0" + this_day.getMinutes() : this_day.getMinutes();
     second_time.innerHTML = (this_day.getSeconds() < 10) ?
       "0" + this_day.getSeconds():this_day.getSeconds();
    }
    //1秒执行一次
    setInterval(setTime, 1000);
    //让1至12个数按函数排这个位置
    function initNumXY(R, r, w, h){
    //数组里面装对象,每个元素对应每个数字的位置
     var numXY = [
      {
       "left" : R + 0.5 * r - 0.5 * w, 
       "top" : R - 0.5 * r * 1.73205 - 0.5 * h
      },
      {
       "left" : R + 0.5 * r * 1.73205 - 0.5 * w, 
       "top" : R - 0.5 * r - 0.5 * h
      },
      {
       "left" : R + r - 0.5 * w, 
       "top" : R - 0.5 * h
      },
      {
       "left" : R + 0.5 * r * 1.73205 - 0.5 * w, 
       "top" : R + 0.5 * r - 0.5 * h
      },
      {
       "left" : R + 0.5 * r - 0.5 * w, 
       "top" : R + 0.5 * r * 1.732 - 0.5 * h
      },
      {
       "left" : R - 0.5 * w, 
       "top" : R + r - 0.5 * h
      },
      {
       "left" : R - 0.5 * r - 0.5 * w, 
       "top" : R + 0.5 * r * 1.732 - 0.5 * h
      },
      {
       "left" : R - 0.5 * r * 1.73205 - 0.5 * w, 
       "top" : R + 0.5 * r - 0.5 * h
      },
      {
       "left" : R - r - 0.5 * w, 
       "top" : R - 0.5 * h
      },
      {
       "left" : R - 0.5 * r * 1.73205 - 0.5 * w, 
       "top" : R - 0.5 * r - 0.5 * h
      },
      {
       "left" : R - 0.5 * r - 0.5 * w, 
       "top": R - 0.5 * r * 1.73205 - 0.5 * h
      },
      {
       "left" : R - 0.5 * w, 
       "top" : R - r - 0.5 * h
      }
     ];
     //获取大盒子
     var clock = document.getElementById("clock");
     //for循环,规定值小于12,
     for(var i = 1; i <= 12; i++){
     //如果除以3能除完,就在div盒子里面写入,并且有两个样式
      if(i%3 == 0) {
       clock.innerHTML += "<div class='clock-num em_num'>"+i+"</div>";
      } else {
       clock.innerHTML += "<div class='clock-num'>" + i + "</div>";
      }
     }
     //获取时钟数字的class类名
     var clock_num = document.getElementsByClassName("clock-num");
     //时钟数的位置
     for(var i = 0; i < clock_num.length; i++) {
      clock_num[i].style.left = numXY[i].left + 'px';
      clock_num[i].style.top = numXY[i].top + 'px';
     }
     //在div盒子里面写入刻度
     for(var i = 0; i < 60; i++) {
      clock.innerHTML += "<div class='clock-scale'> " + 
            "<div class='scale-hidden'></div>" + 
            "<div class='scale-show'></div>" + 
           "</div>";
     }
     var scale = document.getElementsByClassName("clock-scale");
     //将刻度分散布在整个钟表上
     for(var i = 0; i < scale.length; i++) {
      scale[i].style.transform="rotate(" + (i * 6 - 90) + "deg)";
     }
    }
  })();

nodejs代码

//1.导入node模块
//导入http模块
const http = require('http')
//导入fs文件系统模块
const fs = require('fs')
//导入path路径处理模块
const path = require('path')

//2.创建web服务器
//创建服务器实例化对象
const server = http.createServer()
//监听服务器的request事件
server.on('request',(req,res)=>{
    //获取客户端请求的url地址
    const url = req.url
    //把获取的url地址映射成具体文件的存放路径
    //const fpath = path.join(__dirname,url)

    //优化路径
    //定义空白的路径
    let fpath = ''
    if(url === '/'){
        fpath = path.join(__dirname,'./clock/clock.html')

    }else{
        fpath = path.join(__dirname,'/clock',url)
    }
    //根据映射过来的文件路径读取文件
    fs.readFile(fpath,'utf8',(err,dataStr)=>{
        //读取文件失败,向客户端响应错误信息
        if(err){return res.end('404 NOT FOUND')}
        //读取文件成功,将读取成功的内容响应给客户端
        res.end(dataStr)
    })

})
//启动服务器
server.listen(8080,()=>{
    console.log('server running at http://127.0.0.1:8080')
})

实现效果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自动化运维之一(Python入门)

Python简介 python是吉多范罗苏姆发明的一种面向对象的脚本语言&#xff0c;可能有些人不知道面向对象和脚本具体是什么意思&#xff0c;但是对于一个初学者来说&#xff0c;现在并不需要明白。大家都知道&#xff0c;当下全栈工程师的概念很火&#xff0c;而Python是一种全栈的…

docker-compose模板文件、命令的使用

docker-compose官网 一、docker-compose的命令 1、up(启动) 格式为 docker-compose up [options] [SERVICE…] 该命令十分强大&#xff0c;它将尝试自动完成包括构建镜像&#xff0c;&#xff08;重新&#xff09;创建服务&#xff0c;启动服务&#xff0c;并关联服务相关容器…

FAQ是什么?该如何编辑FAQ?

“FAQ”这个关键词可能很多人都见过&#xff0c;但是如果不是行业内的人&#xff0c;大概还不知道它的含义&#xff0c;所以本文将介绍 FAQ和 FAQ文档的编写。 “FAQ”是中文意思&#xff0c;意思是“常见问题解答”或“帮助中心”。研究显示&#xff0c;客户服务支持每天要花…

第四章. Pandas进阶—数据分组统计

第四章. Pandas进阶 4.3 数据分组统计 1.分组统计函数(groupby函数) 1).功能&#xff1a; 根据给定的条件将数据拆分成组每个组否可以独立应用函数&#xff08;sum&#xff0c;mean&#xff0c;min&#xff09;将结果合并到一个数据结构中 2).语法&#xff1a; DataFrame.gro…

5G无线技术基础自学系列 | 物理上行共享信道

素材来源&#xff1a;《5G无线网络优化实践》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 NR PUSCH支持两种波形&#xff08;参阅TS…

Python入门自学进阶-Web框架——26、DjangoAdmin项目应用-数据记录操作

对于每个表显示的数据&#xff0c;点击其中一条&#xff0c;进入这条数据的修改页面&#xff0c;显示此条数据的具体内容&#xff0c;并提供修改、删除等功能。主要是ModelForm的应用。 一、记录数据修改 首先是路由项的添加&#xff0c;点击一条记录后&#xff0c;进入相应的…

MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

什么是MaxEnt模型&#xff1f; MaxEnt模型的原理是什么&#xff1f;有哪些用途&#xff1f; MaxEnt运行需要哪些输入文件&#xff1f;注意那些事项&#xff1f; 融合R语言的MaxEnt模型的优势&#xff1f; 常用数据检索与R语言自动化下载及可视化方法 常用数据下载网站&…

第一章《初学者问题大集合》第7节:编写第一个Java程序

下载并安装好IDEA之后&#xff0c;就可以编写Java程序啦&#xff01;前文曾经讲过&#xff0c;Java程序最初的存在形式是Java源文件&#xff0c;经过编译之后又会产生字节码文件。当今时代&#xff0c;软件项目的规模越来越大&#xff0c;因此软件项目中会有多个Java源文件和字…

Android Gradle - AGP(Android Gradle Plugin)更新失败,你遇到了吗?

因为项目中有Java和Kt&#xff0c;同时也是组件化项目&#xff0c;所以配置方面一直存在一些问题&#xff08;项目可正常运行&#xff0c;只是影响开发效率&#xff09;&#xff0c;此处仅记录我在AndroidStudio中更新AGP&#xff08;Android Gradle Plugin,即Android 官方开发…

jmeter 使用

下载安装 去官网下载binary文件https://jmeter.apache.org/download_jmeter.cgi 解压后&#xff0c;进入解压目录的 /bin/ &#xff0c;通过 sh jmeter 命令来启动 Jmeter。 使用jmeter GUI创建test plan 创建线程组流程&#xff1a;测试计划–>右键–>添加–>线程…

threeJS与模型交互

效果预览 该场景是模拟两个楼层&#xff0c;当鼠标放到不同的楼层上时改变其透明度 blender中的模型如下图&#xff1a; 首先导入模型 import { FBXLoader } from three/examples/jsm/loaders/FBXLoader.js addfbx () {const loader new FBXLoader()loader.load(/models/…

算法:最长递增子序列

一、题目描述 给定一个长度为N的数组a0,a1,a2…,an-1&#xff0c;找出一个最长的单调递增子序列&#xff08;注&#xff1a;递增的意思是对于任意的i<j&#xff0c;都满足ai<aj&#xff0c;此外子序列的意思是不要求连续&#xff0c;顺序不乱即可&#xff09;。例如&…

K8s自动化集群环境搭建

文章目录一、环境规划1.1 集群类型1.2 安装方式二、环境搭建1、主机安装2、主机名分配3、时钟同步4. 禁用firewalld、selinux、postfix5. 禁用swap分区6. 开启IP转发&#xff0c;和修改内核信息7. 配置IPVS功能8. ssh免密认证三、安装docker1、更换阿里云镜像仓库2、安装docker…

【前端】HTTP —— HTTP 协议中的细节(超详细!!)

JavaEE传送门JavaEE 【前端】JavaScript —— JS的基本语法之数组, 函数… 【前端】JavaScript —— WebAPI 目录HTTP 协议抓包工具 fiddler协议格式RequestResponseHTTP 协议中的细节认识 URLURL 基本格式URL encode/ decode认识 "方法" methodGETPOSTGET 和 POST…

感叹之余随手记—他山之石,可以攻玉

如上是开源webRTC项目的一个OC代码文件&#xff0c;注意到文件名是mm后缀了吗&#xff1f; 是的&#xff0c;它是一个OC特性之OC跟C/C代码混编&#xff0c;上面的代码就C runtime跟OC runtime的string对象的互相转化。 开源成就了很多人很多事&#xff01; 开源提升了我们的工作…

MySQL高级学习笔记(二)

文章目录MySQL高级学习笔记(二)1.Mysql的体系结构概览2. 存储引擎2.1 存储引擎概述2.2 各种存储引擎特性2.2.1 InnoDB2.2.2 MyISAM2.2.3 MEMORY2.2.4 MERGE2.3 存储引擎的选择3. 优化SQL步骤3.1 查看SQL执行频率3.2 定位低效率执行SQL3.3 explain分析执行计划3.3.1 环境准备3.3…

【JavaSE】内部类介绍与总结

文章目录内部类的概念静态内部类实例内部类局部内部类匿名内部类内部类的概念 什么是内部类呢&#xff1f;在一个类里面定义了另一个类&#xff0c;我们就把前者称为外部类&#xff0c;后者称为内部类。 静态内部类 内部类也是有分类的&#xff0c;我们先来看看静态的内部类…

开源的滚滚浪潮:近年来开源多样化的几大亮点

导读目前参与进开源社区的人群仍然缺乏多样性&#xff0c;但是好的一面是&#xff0c;许多人、项目和社区正在努力改善这一现状。我从开源社区在2015年以来为提高多样性作出的努力中收集了几大亮点。Outreachy 发展多样性的实习项目 Outreachy 作为软件自由管理局的成员项目之…

7种方式企业内部资料共享,你pick谁?

企业内部资料共享&#xff0c;很多公司也还停留在用微信和QQ分享文件&#xff0c;但小编认为通过IM方式&#xff0c;只能说“发送”文件而已&#xff0c;并没有达到“共享”的需求。 试想一下这几个场景就能明白&#xff1a; 内部材料收集&#xff0c;是一份份地通过微信发送给…

OPENFLOW协议协议分析实践

一、基本要求 1.搭建下图所示拓扑&#xff0c;完成相关 IP 配置&#xff0c;并实现主机与主机之间的 IP 通信。用抓包软件获取控制器与交换机之间的通信数据。 2.查看抓包结果&#xff0c;分析OpenFlow协议中交换机与控制器的消息交互过程&#xff0c;画出相关交互图或流程图。…