跳到主要内容

5 篇博文 含有标签「Node」

查看所有标签

报错警告

npm ERR! code EINVALIDTAGNAME

原因

没有进行npm init便开始安装包。

注意事项

这里我们需要注意的是npm init和npm i并不相同,npm i 代表的是npm install表示安装,并不表示初始化,初始化需要我们npm init这个命令不能够简写。


JustinNode阅读需 1 分钟

使用Node处理表单get请求

表单的格式

一个HTML表单要想点击button按钮就能够提交数据,必须具备以下几个要素:

  1. 表单要有action属性,这个属性是告知浏览器要将数据发送到哪里。
  2. 每一个输入框要有name属性,这个属性是帮助我们定位输入的是什么的。
  3. button的type属性要是submit.
<form action="/pinglun" method="get">
<div class="form-group">
<label for="input_name">你的大名</label>
<input type="text" class="form-control" required minlength="2" maxlength="10" id="input_name"
name="name" placeholder="请写入你的姓名">
</div>
<div class="form-group">
<label for="textarea_message">留言内容</label>
<textarea class="form-control" name="message" id="textarea_message" cols="30" rows="10" required
minlength="5" maxlength="20"></textarea>
</div>
<button type="submit" class="btn btn-default">发表</button>
</form>

服务器端使用Node的核心模块url(将url字符串转换为对象)

  • 引入url模块
const urlParse = require('url')
  • 将url字符串解析为url对象
const parseObj = urlParse.parse(url,true);
  • 获取请求路径(这个请求路径是不包含查询字符串的)
const pathname = parseObj.pathname;
  • 获取表单发送过来的数据
parseObj.query

让客户端的请求进行重定向

  • 首先发送给客户端一个302状态码,让客户端进行临时重定向。
res.statusCode = 302;
  • 通过响应头让客户端跳转到指定的路径(下文的路径是根路径)
res.setHeader('Location','/');

Node中的两种暴露方式

使用exports.xxx进行暴露(需要暴露的内容都在一个对象中)

使用这种暴露方式,暴露的是一个对象,我们以下面的例子进行举例说明:

  • a.js
const test = require('./b');
console.log(test);
  • b.js
const foo = '你好';
exports.foo = foo;

我们对a进行调用,输出结果如下所示

{ foo: '你好' }

使用module.exports = XXX (这样暴露的就是XXX,我们在实际开发的过程中推荐使用这个方式)

  • a.js
const test = require('./b');
console.log(test);
  • b.js
const foo = '你好';
module.exports = foo;

对a.js进行调用,输出结果如下所示:

你好

小结

node中实际暴露的是module.exports这个对象,你给这个对象赋值,返回的就是值,你给对象添加属性,返回的就是含有属性的对象。


JustinNode阅读需 2 分钟

使用readdir获取指定路径下的所有文件名

文件结构 image.png

实现代码

const fs = require('fs');

fs.readdir('G:/pink_code/Node_Study/02',(err,list) => { if (!err) { console.log(list); } })


>代码输出
```js
[ '01_http-helloWorld.js', '02_使用readdir获取指定路径下的所有文件名.js', 'www' ]

在浏览器中使用模板引擎

1. 安装art-template

npm install art-template

2. 通过script标签引入art-template

<script src="./node_modules/art-template/lib/template-web.js"></script>

3. 使用模板引擎语法进行调用

<script src="./node_modules/art-template/lib/template-web.js"></script>
<script type='text/template' id = 'tpl'>
这是{{name}}
</script>

<script>
const test = template('tpl',{
name: 'China'
});
console.log(test);
</script>

在Node中使用模板引擎

1. 安装art-template

npm install art-template

2. 在需要使用模板引擎的模块中加载art-template

3. 查文档,使用模板引擎的API

在Node中使用模板引擎的一个小案例

const template = require('art-template');

const test = template.render('hello {{name}}',{
name: 'NodeJs'
})

console.log(test);

输出结果

hello NodeJs

一个使用模板引擎渲染HTML的小案例

HTML结构

<html dir="ltr" lang="zh">

<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;
user-select: auto;
}

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">C:\Users\HP\Desktop\共享文件\ 的索引</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">C:\Users\HP\Desktop\共享文件\ 的索引</h1>

<div id="parentDirLinkBox" style="display: block;">
<a id="parentDirLink" class="icon up" href="/C:/Users/HP/Desktop/%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6/..">
<span id="parentDirText">[上级目录]</span>
</a>
</div>

<table>
<thead>
<tr class="header" id="theader">
<th id="nameColumnHeader" tabindex="0" role="button">名称</th>
<th id="sizeColumnHeader" class="detailsColumn" tabindex="0" role="button">
大小
</th>
<th id="dateColumnHeader" class="detailsColumn" tabindex="0" role="button">
修改日期
</th>
</tr>
</thead>
<tbody id="tbody">
{{each files}}
<tr>
<td data-value="{{$value}}"><a class="icon file" draggable="true" href="{{$value}}">{{$value}}</a>
</td>
<td class="detailsColumn" data-value="193955">189 kB</td>
<td class="detailsColumn" data-value="1627464963">2021/7/28 下午5:36:03</td>
</tr>
{{/each}}
</tbody>
</table>

</body>

</html>

Node代码

const http = require('http');
const template = require('art-template');
const fs = require('fs');

const server = http.createServer();

server.on('request', (req, res) => {
const url = req.url;

// 文件路径
const filePath = 'G:/pink_code/Node_Study/02';
// 获取文件路径下所有的文件名
let listName;
fs.readdir(filePath, (err, list) => {
if (!err) {
listName = list;
}
})
// 读取模板文件内容
fs.readFile('./www/template.html', (err, data) => {
if (!err) {
data = data.toString();
test = template.render(data,{
files: listName
})
res.end(test);
} else {
console.log('读取文件出错', err);
}
});

})

// 监听3000端口
server.listen(3000, (err) => {
if (!err) {
console.log('服务器启动成功!');
}
})

实现效果

image.png


JustinNode阅读需 3 分钟

require的加载顺序

require加载文件是运行到该位置才加载,请看下面的一段代码 a.js

console.log('a开始执行了');

require('./b');

console.log('a 执行结束了');


**b.js**
```js
console.log('b执行结束');

执行结果

image.png

Node中没有全局作用域只有模块作用域

请看下面的两端代码 a.js

var a = '777'
console.log('a开始执行了');

require('./b');

console.log('a 执行结束了');

console.log('a的值是:',a);

b.js

var a = '666'

console.log('b执行结束');

执行结果

image.png

使用exports暴露模块

exports其实是一个空对象,我们相当于向这个空对象中添加元素,然后进行暴露。 a.js

const test = require('./b');

console.log(test.a);


**b.js**
```js
var a = '666'

exports.a = a;

node运行 a.js image.png

响应中文编码

服务器直接返回中文,在浏览器上显示的是乱码,所以我们可以通过设置setHeader中的编码格式来解决这一问题。

server.on('request',(req,res) => {
res.setHeader('Content-Type','text/plain; charset=utf-8');
res.end('Node,你好');
})

Content-Type有什么作用?

Content-Type就是用来告知对方发送的数据内容是什么类型的。下面我们将给出Content-Type的例子

例子:设置为普通文本类型(plain)与html类型的

server.on('request',(req,res) => {
const url = req.url;
if (url === '/plain') {
res.setHeader('Content-Type','text/plain; charset=utf-8');
res.end('这是中文哦!');
} else if (url === '/html') {
res.end('<h1>你好这是一级标题</h1');
}
})

浏览器会默认将html的字符串解析为HTML代码,如果我们想要的不是HTML代码而是字符串,可以通过设置setHeader为text/plain;


JustinNode阅读需 2 分钟

关于Node是什么,以及如何安装node等基础知识,本系列文章便不再赘述,本专栏的特点是只讲干货,从零基础开始学习NodeJs.

Node和浏览器环境的不同之处

1. Node中没有DOM和BOM

console.log(window);
console.log(document);

我们通过node命令运行上面的代码是会报错的。 image.png

2. 浏览器环境下的JS是没有操作文件的能力的,但是Node有

fs是file-system的简写,是文件系统的意思,在Node中如果想要进行文件操作,就必须引入fs这个核心模块,在fs这个核心模块中,提供了操作文件的相关API,例如fs.readFile就是用来读取文件的。

const fs = require('fs');

fs.readFile('./readme.md',(err,data) => { if (!err) { console.log(data.toString()); } })

![image.png](https://img-blog.csdnimg.cn/img_convert/257d8b6e81d1848b3340ace8746c9f64.png)

## 使用Node创建基础的HTTP服务
```js
// 1. 加载http核心模块
const http = require('http');

// 2. 创建服务器实例
const server = http.createServer();

// 3. 注册request请求事件
server.on('request',(request,response) => {
console.log('服务器端收到请求');
console.log('客户端的请求路径是:',request.url);
response.write('<h1>Hello,Node!</h1>');
// response.end();
if (request.usr = '/index') {
response.write('666');
}
response.end();
})

// 4. 绑定端口号,启动服务器
server.listen(3000,() => {
console.log('服务器启动成功');
});

响应数组、对象、数字等格式的内容使用JSON.stringify

const http = require('http');

// 1. 创建服务器实例
const server = http.createServer();

// 2. 监听请求事件,设置请求处理函数
server.on('request',(request,response) => {
if (request.url === '/index') {
// response.write('666666');
}
const test = [{name: 'justin',phone: '11'}];
response.end(JSON.stringify(test));
})

// 3. 监听指定端口
server.listen(3000,() => {
console.log('服务器启动成功!');
})

使用OS模块获取当前系统的信息

const os = require('os');

console.log(os.cpus());
[
{
model: 'Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz',
speed: 2304,
times: {
user: 1780218,
nice: 0,
sys: 2250343,
idle: 24643734,
irq: 617593
}
},
{
model: 'Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz',
speed: 2304,
times: {
user: 1810000,
nice: 0,
sys: 1999546,
idle: 24864125,
irq: 370703
}
},
{
model: 'Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz',
speed: 2304,
times: {
user: 1855187,
nice: 0,
sys: 1691656,
idle: 25126828,
irq: 148062
}
},
{
model: 'Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz',
speed: 2304,
times: {
user: 1898781,
nice: 0,
sys: 1538750,
idle: 25236140,
irq: 65781
}
}
]

JustinNode阅读需 2 分钟