认真学习,认真记录,每天都要有进步呀!!!

加油叭!!!

一、简单实现Apache功能

var http = require('http')
var fs = require('fs') // 1. 创建 Server
var server = http.createServer() // 2. 监听 Server 的 request 请求事件,设置请求处理函数
// 请求
// 处理
// 响应
// 一个请求对应一个响应,如果在一个请求的过程中,已经结束响应了,则不能重复发送响应。
// 没有请求就没有响应。
// 在Apache 服务器软件中,默认有一个 www 目录,所有存放在 www 目录中的资源都可以通过网址来浏览
// localhost/hello.txt
// localhost/index.html
// localhost/login/login.html
// localhost/img/dt.jpg // D:\前端\Node.js\www
var wwwDir = 'D:\\前端\\Node.js\\www' server.on('request', function (req, res) {
var url = req.url
// / 或者 /index.html
// /a.txt wwwDir + /a.txt
// /apple/login.html wwwDir + /apple/login.html
// /img/ab1.jpg wwwDir + /img/ab1.jpg
if (url === '/') {
fs.readFile(wwwDir + '/index.html', function (err, data) {
if (err) {
// return 有两个作用:
// 1. 方法返回值
// 2. 阻止代码继续往后执行
return res.end('404 Not Found.')
}
res.end(data)
})
} else if (url === '/hello.txt') {
fs.readFile(wwwDir + '/hello.txt', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
} else if (url === '/index.html') {
fs.readFile(wwwDir + '/index.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
} else if (url === '/login/login.html') {
fs.readFile(wwwDir + '/login/login.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
}else if (url === '/img/dt.jpg') {
fs.readFile(wwwDir + '/img/dt.jpg', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
}
}) // 3. 绑定端口号,启动服务
server.listen(3000, function () {
console.log('running...')
})

来吧展示:



二、实现Apache目录列表

var http = require('http')
var fs = require('fs') var server = http.createServer() var wwwDir = 'D:\\前端\\Node.js\\www' server.on('request', function (req, res) {
fs.readFile('./template.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
// 1. 如何得到 wwwDir 目录列表中的文件名和目录名
// fs.readdir()方法可以得到一个目录下的所有文件名和目录名
// 2. 如何将得到的文件名和目录名替换到 template.html 中
// 2.1 在 template.html 中需要替换的位置预留一个特殊的标记(就像以前使用模板引擎的标记一样)
// 2.2 根据 files 生成需要的 HTML 内容 fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
// console.log(files) ----> [ 'hello.txt', 'img', 'index.html', 'login' ] // 2.1 生成需要替换的内容
var content = ''
// <td data-value="apple/"><a class="icon dir" href="/D:/Movie/www/apple/">`item`/</a></td>
// 在 EcmaScript 6 的 ` 字符串中,可以使用 ${} 来引用变量
files.forEach(function (item) {
content += `
<tr>
<td data-value="apple/"><a class="icon dir" href="#">${item}/</a></td>
<td class="detailsColumn" data-value="0"></td>
<td class="detailsColumn" data-value="1509589967">2020/10/10 上午10:10:10</td>
</tr>
`
}) // 2.3 替换
// console.log(data) -----> 打印结果: <Buffer 3c 68 74 6d 6c 20 64 69 72 3d 22 6c 74 72
// 22 20 6c 61 6e 67 3d 22 7a 68 22 20 69 31 38 6e 2d 70 72 6f
// 63 65 73 73 65 64 3d 22 22 3e 0d 0a 0d 0a 3c 68 ... 4342 more bytes>
// 需要用toString()转换成我们想要的数据
data = data.toString()
data = data.replace('需要替换的地方', content)
// 3. 发送解析替换过后的响应数据
res.end(data)
})
})
})
server.listen(3000, function () {
console.log('running...')
})

template.html

<html dir="ltr" lang="zh" i18n-processed="">
<head>
<meta charset="utf-8">
<meta name="google" value="notranslate">
<style>
h1 {
border-bottom: 1px solid #c0c0c0;
margin-bottom: 10px;
padding-bottom: 10px;
white-space: nowrap;
}
table {
border-collapse: collapse;
}
th {
cursor: pointer;
}
td.detailsColumn {
-webkit-padding-start: 2em;
text-align: end;
white-space: nowrap;
}
a.icon {
-webkit-padding-start: 1.5em;
text-decoration: none;
}
a.icon:hover {
text-decoration: underline;
}
a.file {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ") left top no-repeat;
}
a.dir {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ") left top no-repeat;
}
a.up {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ") left top no-repeat;
}
html[dir=rtl] a {
background-position-x: right;
}
#parentDirLinkBox {
margin-bottom: 10px;
padding-bottom: 10px;
}
#listingParsingErrorBox {
border: 1px solid black;
background: #fae691;
padding: 10px;
display: none;
}
</style>
<title id="title">D:\Movie\www\ 的索引</title>
</head>
<body>
<div id="listingParsingErrorBox">糟糕!Google Chrome无法解读服务器所发送的数据。请<a href="http://code.google.com/p/chromium/issues/entry">报告错误</a>,并附上<a href="LOCATION">原始列表</a>。</div>
<h1 id="header">D:\前端\Node.js\www 的索引</h1>
<div id="parentDirLinkBox" style="display:none">
<a id="parentDirLink" class="icon up">
<span id="parentDirText">[上级目录]</span>
</a>
</div>
<table>
<thead>
<tr class="header" id="theader">
<th onclick="javascript:sortTable(0);">名称</th>
<th class="detailsColumn" onclick="javascript:sortTable(1);">
大小
</th>
<th class="detailsColumn" onclick="javascript:sortTable(2);">
修改日期
</th>
</tr>
</thead>
<tbody id="tbody">需要替换的地方</tbody>
</table>
</body>
</html>

来吧展示:

三、在Node中使用模板引擎

  1. 安装模板引擎
npm install art-template

该命令在哪执行就会把包下载到哪里。默认会下载到 node_modules 目录中 node_modules 不要改,也不支持改。

  1. 在需要使用的文件模块中加载 art-template

只需要使用 require 方法加载就可以了:require('art-template') 参数中的 art-template

就是你下载的包的名字 也就是说你 isntall 的名字是什么,则你 require 中的就是什么

栗子:

var template = require('art-template')
var fs = require('fs')
fs.readFile('./tpl.html', function (err, data) {
if (err) {
return console.log('读取文件失败了')
}
var ret = template.render(data.toString(), {
name: 'Chinatsu',
age: 18,
province: '盐城市',
hobbies: [
'吃饭',
'睡觉',
'敲代码'
],
title: '个人信息'
})
console.log(ret)
})

tpl.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<p>大家好,我叫:{{ name }}</p>
<p>我今年 {{ age }} </p>
<h1>我来自 {{ province }}</h1>
<p>我喜欢:{{each hobbies}} {{ $value }} {{/each}}</p>
<script>
var foo = '{{ title }}'
</script>
</body>
</html>

来吧展示:

三、在浏览器中使用模板引擎

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>06-在浏览器中使用art-template</title>
</head>
<body>
//注意:在浏览器中需要引用 lib/template-web.js 文件 //强调:模板引擎不关心你的字符串内容,只关心自己能认识的模板标记语法,例如 {{}}
//{{}} 语法被称之为 mustache 语法,八字胡。 <script src="node_modules/art-template/lib/template-web.js"></script>
<script type="text/template" id="tpl">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p>大家好,我叫:{{ name }}</p>
<p>我今年 {{ age }} </p>
<h1>我来自 {{ province }}</h1>
<p>我喜欢:{{each hobbies}} {{ $value }} {{/each}}</p>
</body>
</html>
</script>
<script>
var ret = template('tpl', {
name: '千夏Chinastu',
age: 18,
province: '盐城市',
hobbies: [
'吃饭',
'睡觉',
'敲代码'
]
})
console.log(ret)
</script>
</body>
</html>

来吧展示:

四、在Apache案例中加入模板引擎

var http = require('http')
var fs = require('fs')
var template = require('art-template')
var server = http.createServer()
var wwwDir = 'D:/前端/Node.js/www'
server.on('request', function (req, res) {
var url = req.url
fs.readFile('./template-apache.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
// 这里只需要使用模板引擎解析替换 data 中的模板字符串就可以了
// 数据就是 files
// 然后去你的 template.html 文件中编写你的模板语法就可以了
var htmlStr = template.render(data.toString(), {
files: files
}) res.end(htmlStr)
})
})
})
server.listen(3000, function () {
console.log('running...')
})

template-apache.html和template.html文件一样,不同的地方

<tbody id="tbody">
{{each files}}
<tr>
<td data-value="apple/"><a class="icon dir" href="#">{{$value}}/</a></td>
<td class="detailsColumn" data-value="0"></td>
<td class="detailsColumn" data-value="1509589967">2017/11/2 上午10:32:47</td>
</tr>
{{/each}}
</tbody>

五、留言本案例:

项目结构:

1. 整合静态资源

  1. 把当前模块所有的依赖项都声明再文件模块最上面
  2. 为了让目录结构保持统一清晰,所以我们约定,把所有的 HTML 文件都放到 views(视图) 目录中
  3. 我们为了方便的统一处理这些静态资源,所以我们约定把所有的静态资源都存放在 public 目录中
  4. 哪些资源能被用户访问,哪些资源不能被用户访问,我现在可以通过代码来进行非常灵活的控制
  5. 整个 public 目录中的资源都允许被访问

app.js

var http = require('http')
var fs = require('fs')
http
.createServer(function(req,res){
// res.end('hello') // /public/lib/bootstrap.css
// /public/css/main.css
// /public/js/main.js var url = req.url
if(url=='/'){
fs.readFile('./views/index.html',function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})
}else if(url.indexOf('/public')==0){
// 统一处理:
//如果请求路径是以 /public/ 开头的,则我认为你要获取 public 中的某个资源
//所以我们就直接可以把请求路径当作文件路径来直接进行读取
// console.log(url)
fs.readFile('.' + url,function(err,data){
if(err){
return res.end('404')
}
res.end(data) })
} })
.listen(5000,function(){
console.log('running.....')
})

注意:

在服务端中,文件的路径就不要写相对路径了

因为这个时候所有的资源都是通过url标识来获取的

我们的服务器开放了/public/目录

所有这里的请求路径都写成: /public/xxx

浏览器在真正发送请求的时候会自动把http:localhost:5000拼上

index.html

<!DOCTYPE html>
<!-- saved from url=(0027)http://192.168.150.76:3000/ -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>留言本</title> <link rel="stylesheet" href="/public/lib/bootstrap/dist/css/bootstrap.css">
<!-- <link rel="stylesheet" href="/public/css/main.css"> --> <body>
<div class="header container">
<div class="page-header">
<h1>Example page header <small>Subtext for header</small></h1>
<a class="btn btn-success" href="http://192.168.150.76:3000/post">发表留言</a>
</div>
</div>
<div class="comments container">
<ul class="list-group"> <li class="list-group-item">不错说:对南沙健康拿到数据看定金款三 <span class="pull-right">2017-11-2 17:11:22</span></li> <li class="list-group-item">范家伟说:香锅还是香锅啊 <span class="pull-right">2017-11-2 17:11:22</span></li> <li class="list-group-item">王汪汪说:能看出来是谁发的吗 <span class="pull-right">2017-11-2 17:11:22</span></li> <li class="list-group-item">马化腾说:不充钱怎么变得更强 <span class="pull-right">2017-11-2 17:11:22</span></li> </ul>
</div> <!-- <script src="/public/js/main.js"></script> --> </body></html>

2. 页面跳转404处理

app.js部分

else{
fs.readFile('./views/404.html' ,function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})

404.html

<h1>抱歉!  您访问的页面失联啦...</h1>

3. 页面跳转到post页面

inde.html部分

<a class="btn btn-success" href="/post">发表留言</a>

post.html部分

 <link rel="stylesheet" href="/public/lib/bootstrap/dist/css/bootstrap.css">
<h1><a href="/">首页</a> <small>发表评论</small></h1>

4. 渲染评论首页

  1. 添加一个假数据渲染到首页
var comments = [
{
name: '张三',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三2',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三3',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三4',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三5',
message: '今天天气不错!',
dateTime: '2020-10-10'
}
]
  1. 引入模板引擎
var template = require('art-template')
  1. 使用模板的render()方法渲染数据
if(url=='/'){
fs.readFile('./views/index.html',function(err,data){
if(err){
return res.end('404')
}
var htmlStr = template.render(data.toString(),{
comments:comments
})
res.end(htmlStr)
})
  1. 在页面遍历循环渲染数据
 <ul class="list-group">
{{each comments}}
<li class="list-group-item">{{ $value.name }}说:{{ $value.message }} <span class="pull-right">{{ $value.dateTime }}</span></li>
{{/each}}
</ul>

5.处理表单get提交

  1. 表单控件元素都加上name属性
<label for="input_name">你的大名</label>
<input type="text" class="form-control" required minlength="2" maxlength="10" id="input_name"
name="name" placeholder="请写入你的姓名">
<label for="textarea_message">留言内容</label>
<textarea class="form-control" name="message"
id="textarea_message" cols="30" rows="10"
required minlength="5" maxlength="20"></textarea>
  1. 给表单元素添加actionmethod
<form action="/pinglun" method="get">
  1. 引入url模块
var url = require('url')
  1. 定义变量接收新的 url
//使用 url.parse 方法将路径解析为一个方便操作的对象
//第二个参数为 true 表示直接将查询字符串转为一个对象(通过 query 属性来访问)
var parseObj = url.parse(req.url, true)
var pathname = parseObj.pathname
//单独获取不包含查询字符串的路径部分(该路径不包含 ? 之后的内容)
  1. 将所有的url更改成pathname
pathname=='/'
if(pathname=='/post')
if(pathname.indexOf('/public')==0
fs.readFile('.' + pathname,function(err,data)
  1. 查看 parseObj.query
console.log('收到表单请求了',parseObj.query)

  1. 响应查看 JSON.stringify(parseObj.query)结果
	res.end(JSON.stringify(parseObj.query))

6.表单提交重定向

注意:这个时候无论 /pinglun?xxx 之后是什么,我都不用担心了,因为我的 pathname 是不包含 ? 之后的那个路径

一次请求对应一次响应,响应结束这次请求也就结束了

所以应该把 注释掉 // res.end(JSON.stringify(parseObj.query))

我们已经使用 url 模块的 parse 方法把请求路径中的查询字符串给解析成一个对象了

所以接下来要做的就是:

  1. 获取表单提交的数据 parseObj.query
  2. 将当前时间日期添加到数据对象中,然后存储到数组中
  3. 让用户重定向跳转到首页 /

    当用户重新请求 / 的时候,我数组中的数据已经发生变化了,所以用户看到的页面也就变了
else if(pathname=='/pinglun'){
// console.log(url)
// console.log('收到表单请求了',parseObj.query)
// 一次请求对应一次响应,响应结束,请求也就结束了
// res.end(JSON.stringify(parseObj.query))
var comment = parseObj.query
comment.dateTime = '2020-10-10'
comments.push(comment)
// 往头追加
// comments.unshift(comment)
// 服务端这个时候已经把数据存储好了,接下来就是让用户重新请求 / 首页,就可以看到最新的留言内容了 // 如何通过服务器让客户端重定向?
// 1. 状态码设置为 302 临时重定向
// statusCode
// 2. 在响应头中通过 Location 告诉客户端往哪儿重定向
// setHeader
// 如果客户端发现收到服务器的响应的状态码是 302 就会自动去响应头中找 Location ,然后对该地址发起新的请求
// 所以你就能看到客户端自动跳转了
res.statusCode = 302
res.setHeader('Location', '/')
res.end()

将数据追加到后面

comments.push(comment)

将数据追加到前面

comments.unshift(comment)

整合代码:

app.js

var http = require('http')
var fs = require('fs')
var template = require('art-template')
var url = require('url')
var comments = [
{
name: '张三',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三2',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三3',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三4',
message: '今天天气不错!',
dateTime: '2020-10-10'
},
{
name: '张三5',
message: '今天天气不错!',
dateTime: '2020-10-10'
}
] http
.createServer(function(req,res){
var parseObj = url.parse(req.url, true)
var pathname = parseObj.pathname
if(pathname=='/'){
fs.readFile('./views/index.html',function(err,data){
if(err){
return res.end('404')
}
var htmlStr = template.render(data.toString(),{
comments:comments
})
res.end(htmlStr)
}) }else if(pathname=='/post'){
// console.log(url)
fs.readFile('./views/post.html',function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})
}else if(pathname=='/pinglun'){
var comment = parseObj.query
comment.dateTime = '2020-10-10'
comments.push(comment)
// 往头追加
// comments.unshift(comment) res.statusCode = 302
res.setHeader('Location', '/')
res.end()
}else if(pathname.indexOf('/public')==0){
// console.log(url)
fs.readFile('.' + pathname,function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})
}else{
fs.readFile('./views/404.html' ,function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})
}
})
.listen(5000,function(){
console.log('running.....')
})

Node.js学习笔记----day02的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一)

    1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...

  8. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  9. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  10. node.js学习笔记(三)——事件循环

    要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...

随机推荐

  1. django-environ学习

    官方说明:https://django-environ.readthedocs.io/en/latest/index.html install pip install django-environ q ...

  2. TypeScript(基础篇)day01

    一.TS介绍 1.1 简介 ts是2012年由微软开发,在js的基础上添加了类型支持 1.2 优劣势 优势 :任何位置都有代码提示,增加效率:类型系统重构更容易:使用最新的ECMAscript语法 劣 ...

  3. Redis Cluster 数据分片

    介绍 Redis Cluster Redis 集群是 Redis 提供的分布式数据库方案, 集群通过分片(sharding) 来进行数据共享, 并提供复制和故障转移功能. 节点 一个 Redis 集群 ...

  4. 搭建K8S集群前置条件

    搭建K8S集群 搭建k8s环境平台规划 单master集群 单个master节点,然后管理多个node节点 多master集群 多个master节点,管理多个node节点,同时中间多了一个负载均衡的过 ...

  5. DevOps 必备的 Kubernetes 安全清单

    Kubernetes 是当今许多公司采用的容器编排平台,它的实施需要对其生态系统有一定的了解,以便部署一个准备好用于生产的集群.然而从原则上来说,Kubernetes 并不是一个安全的平台,因为它缺乏 ...

  6. 深度学习之logistics回归

    在开始之前,事先声明本文参考[中文][吴恩达课后编程作业]Course 1 - 神经网络和深度学习 - 第二周作业_何宽的博客-CSDN博客_吴恩达课后编程作业 加上自己的理解,希望可以不用重复看吴恩 ...

  7. (C++) 初始化列表 std::initializer_list

    构造时直接使用初始化列表 T object { arg1, arg2, ... }; (1) T { arg1, arg2, ... } (2) new T { arg1, arg2, ... } ( ...

  8. 关于 .NET 在不同操作系统中 IO 文件路径拼接方法结升级 .NET 7 后注意到的一个小坑

    .NET 现在支持跨平台这件事情已经是众所周知的特点了,虽然平台整体支持跨平台了,但是我们的代码如果真的想要实现跨平台运行其实还是有些小细节要注意的,今天想要记录分享的就是关于 文件I/O操作时路径的 ...

  9. Zabbix技术分享——监控windows进程资源使用情况

    监控系统进程资源的使用情况是IT运维的常规操作.在实际工作中,运维人员有可能遇到可以使用Zabbix Agent监控linux系统进程,却无法监控windows系统进程的情况.这是因为Zabbix A ...

  10. 【每日一题】【迭代器,泛型】2022年1月8日-NC93 设计LRU缓存结构

    描述设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能1. set(key, value):将记录(key, value)插入该结构2. get(key): ...