node.js笔记

一.必要前提

必须学懂计算机网络基础知识
必须学懂计算机网络基础知识
必须学懂计算机网络基础知识
不然都不知道在讲什么

网络基础知识菜鸟教程地址 https://www.runoob.com/w3cnote/summary-of-network.html
网络层次划分—>OSI七层网络模型—>IP地址—>子网掩码及网络划分—>ARP/RARP协议—>路由选择协议TCP/IP协议—>UDP协议 —>DNS协议—> NAT协议 —>DHCP协议—>HTTP协议
1.一些系统级的API 文件读写File System 进程管理Process 网络通信(HTTP/HTTPS)

$npx node http- serve npx是一个特殊的工具 node_moudles中没有的模块,npx会自动查找安装

//运行出来的是本电脑的IP

2.es6简写

const http = require ('http')

http.createServer(req,res){  //req url传来的信息   //res给浏览器的信息   (回应)

console.log(req.url)    //获取url

  res.writeHead(200,{'Content-Type': 'text/html;charest='utf-8'}); //状态码是200 请求头HTML,字符编码是utf-8

res.write('xxxxxx')   //里面如果是中文会乱码  

res.end();   //结束响应  ()可以输入一些信息

}).listen(3000)   //监听这个端口  一般建议3000以上  以免和别的重复

url模块的使用

url.parse() //解析url地址

url.format(urlObject) //把地址转换成object

url.resolve(from,to)添加或替换地址

例:var api = ‘http://www.kkk.com?name=999&age=9999999’

​ var Getapi = url.parse(api) //此时如果打印,会在服务端上出现URL对象,里面有url详情

​ 此时: var temp = url.parse(api,true).query //打印temp,会把url地址query携带的数据转换成对象

const myURL = new URL('https://%CF%80.example.com/foo');
console.log(myURL.href);
// 打印 https://xn--1xa.example.com/foo
console.log(myURL.origin);
// 打印 https://xn--1xa.example.comconst myURL = new URL('https://%CF%80.example.com/foo');
console.log(myURL.href);
// 打印 https://xn--1xa.example.com/foo
console.log(myURL.origin);
// 打印 https://xn--1xa.example.com

二 . superviisior ,观察文件是否被修改 替代node命令 修改文件后立即生效 (原来是修改后要先结束才可以运行)

npm i -g supervisor

1、安装了nodejs就会有npm 。

2、supervisor修改代码后可以自动重启web服务

3、安装cnpm (推荐)

http://npm.taobao.org/

npm install -g cnpm --registry=https://registry.npm.taobao.org

4、安装supervisor

npm -g install supervisor 或者 cnpm -g install supervisor (只需要安装一次)

5、运行代码

supervisor app.js

一、Node.js 创建第一个应用

1、引入http 模块

var http = require("http");

2、创建服务器
接下来我们使用http.createServer() 方法创建服务器,并使用listen 方法绑定8888 端口。
函数通过request, response 参数来接收和响应数据。

var http = require('http');
http.createServer(function (request, response) {
// 发送HTTP 头部
// HTTP 状态值: 200 : OK
//设置HTTP 头部,状态码是200,文件类型是html,字符集是utf8
response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
// 发送响应数据"Hello World"
res.end("哈哈哈哈,我买了一个iPhone" + (1+2+3) + "s");
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

运行:node server.js

二. 在Node 中,模块分为三类:

一类是Node 提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块。,也可以使用第三方的NPM
模块
• 核心模块部分在Node 源代码的编译过程中,在Node 进
程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。
如:HTTP 模块、URL 模块、Fs 模块都是nodejs 内置的核心模块,可以直接引入使用。
• 文件模块 则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程、
速度相比核心模块稍微慢一些,但是用的非常多。这些模块需要我们自己定义。

1. 定义一个自定义模块
var tools = {
sayHello: function() {
return 'hello NodeJS';
},
add: function(x, y) {
return x + y;
}
};
// 模块接口的暴露
// module.exports = tools;
exports.sayHello = tools.sayHello;
exports.add = tools.add;

其他文件中:
// 引入自定义的tools.js 模块
var http = require('http');
var tools= require('./tools');
tools.sayHello(); //使用模块

三、NPM

1. npm init 生成package.json
npm init --yes

package.json :包描述文件,可以看出来配置的包信息,安装了哪些东西

发给同事的时候,同事情看了package.json后, npm i 可以自动安装所依赖的包

完全符合CommonJs 规范的包目录一般包含如下这些文件。
• package.json :包描述文件。
• bin :用于存放可执行二进制文件的目录。
• lib :用于存放JavaScript 代码的目录。
• doc :用于存放文档的目录。

NPM包的使用例子 😦 格式化日期的包)

npm i silly-datetime –save
var sd = require('silly-datetime');
sd.format(new Date(), 'YYYY-MM-DD HH:mm');
2. npm的使用

npm -v 查看npm 版本

npm uninstall moudleName 卸载模块

npm list 查看当前目录下已安装的node 包

创建package.json npm init 或者npm init –yes

npm i log4js -D 记录日志 根据文档使用 在app.js中 配置执行后会生成一个文件 显示所有操作记录

node的浏览器端调试 node --inspect --inspect-brk serve.js

node进程管理工具

-supervisor

-nodemon

-forever

-pm2

npx http-server -p 端口 可以运行在wweb中 端口9000或8000自己配

3. 淘宝镜像的使用

npm有时候太慢 cnpm能快一些

npm install -g cnpm --registry=https://registry.npm.taobao.org

四. fs模块的使用

1. fs.stat 检测是文件还是目录
const fs = require('fs')
fs.stat('hello.js', (error, stats) =>{
if(error){
console.log(error)
} else {
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目录:${stats.isDirectory()}`)
}
})

2. fs.mkdir 创建目录 fs.mkdir(path[, options], callback)
const fs = require('fs')

fs.mkdir('logs', (error) => {
if(error){
console.log(error)
} else {
console.log('成功创建目录:logs')
}
})
或者  
// 创建 `/目录1/目录2/目录3`,不管 `/目录1` 和 `/目录1/目录2` 是否存在。
fs.mkdir('/目录1/目录2/目录3', { recursive: true }, (err) => {//recursive 属性(指示是否要创建父目录))
  if (err) throw err;
});
3.fs.writeFile 创建写入文件 fs.writeFile(file, data[, options], callback)
fs.writeFile('logs/hello.log', '您好~ \n', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功写入文件')
}
})
或者
const data = new Uint8Array(Buffer.from('Node.js 中文网'));
fs.writeFile('文件.txt', data, (err) => {
  if (err) throw err;
  console.log('文件已被保存');
});
4. fs.appendFile 追加文件fs.appendFile(path, data[, options], callback)
fs.appendFile('logs/hello.log', 'hello ~ \n', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功写入文件')
}
})
5 fs.readFile 读取文件
const fs = require('fs')

fs.readFile('文件名', (err, data) => {
  if (err) throw err;
  console.log(data);
});
6 fs.readdir 读取目录 其中 files 是目录中文件的名称的数组(不包括 '.''..')。
const fs = require('fs')

fs.readdir('logs', (error, files) => {
if (error) {
console.log(error)
} else {
console.log(files)
}
})
7 fs.rename 重命名

异步地把 oldPath 文件重命名为 newPath 提供的路径名 如果 newPath 已存在,则覆盖它

fs.rename(oldPath, newPath, callback)

const fs = require('fs')

fs.rename('js/hello.log', 'js/greeting.log', (error) =>{
if (error) {
console.log(error)
} else {
console.log('重命名成功')
}
})
8 fs.rmdir 删除目录 fs.rmdir(path[, options], callback)
fs.rmdir('logs', (error) =>{
if (error) {
console.log(error)
} else {
console.log('成功的删除了目录:logs')
}
})
9 fs.unlink 删除文件 fs.unlink(path, callback)
fs.unlink(`logs/${file}`, (error) => {
if (error) {
console.log(error)
} else {
console.log(`成功的删除了文件: ${file}`)
}
})
10 fs.createReadStream 从文件流中读取数据. fs.createReadStream(path[, options])

与可读流的 16 kb 的默认 highWaterMark 不同,此方法返回的流具有 64 kb 的默认 highWaterMark

const fs = require('fs')

var fileReadStream = fs.createReadStream('data.json')
let count=0;
var str='';
fileReadStream.on('data', (chunk) => {
console.log(`${ ++count } 接收到:${chunk.length}`);
str+=chunk
    })
fileReadStream.on('end', () => {
console.log('--- 结束---');
console.log(count);
console.log(str);
})
fileReadStream.on('error', (error) => {
console.log(error)
})

或者

const fs = require('fs');
// 从某个字符设备创建流。
const stream = fs.createReadStream('设备');
setTimeout(() => {
  stream.close(); // 这可能不会关闭流。
  // 手动标记流的结束,就像底层的资源自身已表明文件的结束一样,使得流可以关闭。
  // 这不会取消待处理的读取操作,如果存在此类操作,则进程可能仍无法成功地退出,直到完成。
  stream.push(null);
  stream.read(0);
}, 100);
11 fs.createWriteStream 写入文件 fs.createWriteStream(path[, options])
var fs = require("fs");
var data = '我是从数据库获取的数据,我要保存起来';
// 创建一个可以写入的流,写入到文件output.txt 中
var writerStream = fs.createWriteStream('output.txt');
// 使用utf8 编码写入数据
writerStream.write(data,'UTF8');
// 标记文件末尾
writerStream.end();
// 处理流事件--> finish 事件
writerStream.on('finish', function() { /*finish - 所有数据已被写入到底层系统时触发。*/
console.log("写入完成。");
});
writerStream.on('error', function(err){
console.log(err.stack);
});
console.log("程序执行完毕");
12 管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
// 管道读写操作
// 读取input.txt 文件内容,并将内容写入到output.txt 文件中
readerStream.pipe(writerStream);
console.log("程序执行完毕");

五. 用async await 处理异步

async 会将其后的函数(函数表达式或Lambda)的返回值封装成一个Promise 对象,而await 会等待这个Promise 完成,并将其resolve 的结果返回出来。

例子

function findData() {
return new Promise(resolve => {
setTimeout(() => resolve("long_time_value"), 1000);
});
async function test() {
const v = await findData();
console.log(v);
}
test();

六. 利用HTTP 模块Url 模块Path 模块Fs模块创建一个静态WEB 服务器

1、WEB 服务器介绍

Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向
浏览器等Web 客户端提供文档,也可以放置网站文件让全世界浏览,还可以放置数据文件,
让全世界下载。目前最主流的Web 服务器有Apache 、Nginx 、IIS 等。

2、Nodejs 创建一个WEB 服务器作用

2.1、可以让我们访问web 服务器上面的网站
2.2、可以让我们下载web 服务器上面的文件

3、创建

使用http.createServer() 方法创建服务器,并使用listen 方法绑定3000 端口。
函数通过request, response 参数来接收和响应数据。

var http = require(“http”);

const http =require(‘http’);
http.createServer((req,res)=>{
//状态码是200,文件类型是html,字符集是utf-8
res.writeHead(200,{“Content-type”:“text/html;charset=‘utf-8’”});
res.write(" ");
res.write(‘你好nodejs’);
res.write(‘

你好nodejs

’);
res.end(); //结束响应
}).listen(3000);

七. NodeJs 封装静态WEB 服务、路由、EJS 模板引擎、GET、POST

1、路由

路由(Routing)是由一个URI(或者叫路径)和一个特定的HTTP 方法(GET、POST 等)组成
的,涉及到应用如何响应客户端对某个网站节点的访问。
通俗的说:
路由指的就是针对不同请求的URL,处理不同的业务逻辑。

2、初识EJS 模块引擎

我们学的EJS 是后台模板,

可以把我们数据库和文件读取的数据显示到Html 页面上面。实现动态网站

2.1 它是一个第三方模块,需要通过npm 安装

https://www.npmjs.com/package/ejs

npm install ejs –save / cnpm install ejs --save
2.2 EJS 常用标签

<% %>流程控制标签
<%= %>输出标签(原文输出HTML 标签)
<%- %>输出标签(HTML 会被浏览器解析)

ejs.renderFile(filename, data, options, function(err, str){
// str => Rendered HTML string
})

描述 filename 要加载的HTML

​ data 要把哪些数据渲染到HTML上

​ options 参数

callback 渲染结束返回渲染结束的数据

3、Get、Post

超文本传输协议(HTTP)的设计目的是保证客户端机器与服务器之间的通信。
在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和POST。
3.1 GET - 从指定的资源请求数据。(一般用于获取数据)

var urlinfo=url.parse(req.url,true);
urlinfo.query;

3.2 POST - 向指定的资源提交要被处理的数据。(一般用于提交数据)

var postData = '';
// 数据块接收中
req.on('data', function (postDataChunk) {
postData += postDataChunk;
});
// 数据接收完毕,执行回调函数
req.on('end', function () {
try {
postData = JSON.parse(postData);
} catch (e) { }
req.query = postData;
console.log(querystring.parse(postData));
});

中间键 做代理用 可以用来设置静态目录 express.static()

设置静态目录

app.use(express.static(装前端网页的文件名)) 一般在app.js文件种

一般前端写的网页打开路径显示的是某个盘,这个方法可以让它以http开头的的

形式产生

可以让我们通过http的方式 来访问静态文件

他的效果和我们把问价按放到phpstudy服务器上面的效果是一样的

代理:有个接口 前端不能直接请求 现在通过node.js做一个代理,前端就可以随意请求

八.stream流

4种类型在node种

Readable 可读操作

writable 可写操作

Duple 可读可写操作

Transform 操作可写入数据 然后读出结果

所有stream对象 都是EVentEmite的实例

data 当有数据可读时触发

end 没有更多数据可读取触发

error 在接收和写入过程之中 发生错误触发

finish 所有数据写入完成触发

express是一个简介的node.js应用框架 可以帮助快速搭建网站

可以使用中间键来响应http请求

可以手动设置一些简单的路由

如 新建一个目录

npm i express --save save的意思是是安装在开发目录而不是全局安装

九、mongodb数据库基本操作

use ityinf 切换到ityinf数据库

db.user.insert('name:‘xiaoming’) 插入数据 user表示一个表 集合

切换ityinf,insert新增一个数据相当于创建了ityinf数据库中新建了一个表 一个数据

show collections 展示当前数据库里面的表,数据

db.user.find 查看数据库某个表里面的数据

db.user.drop() 删除数据库中的某个表 集合

db.drop Database 删除数据库

db.user.find({‘age’:22}) 查询age=22的记录

db.user.find({‘age’:{gt$:22}}) 查询age>22的记录

db.user.find({age:{’$It’:22}}) 查询age<22的记录

db.user.find({age:{$gte:22}}) 查询age>=22的记录

db.user.find({age:{$Ite:22}}) 查询age<=22的记录

db.user.find({age:{ g t e : 22 , gte:22, gte:22,Ite:26}}) 查询age>22,age<=26的记录

db.user.find({name:/mongo/}) 查询name中包含mongo的数据

db.user.find({name:/^mongo/}) 查询name中以mongo开头的数据

db.user.find({},{name:1,mongo:1}) 查询指定列name age数据

db.user.find().sort({age:1}) 1升序

db.user.find().({age-1}) -1降序

db.user.find({name:‘zahngsan’,age:‘22’}) 查询name=zhangsan,age=22

db.user.find().limit(5) 查询前5条数据

db.user.find().skip(10) 查询10条以后

------------分页-------------------------------------------

查询5-10之间的分页

db.user.find().skip(5). limit(10)

or与查询 db.user.find({$or:[{age:22},{age:25}]})

db.user.find({age:{$age:25}}).count()查询某个结果集的记录条数

db.user.findOne()查询第一条


修改数据

db.student.updata({‘name’:‘小明’},{$set:{‘age’:16}})

查找数学成绩70,把年龄改为12

db.student.updata({‘score.shuxue’:70},{$set:{‘age’:12}})

如果要批量修改,在最后加上{multi:true}


删除数据

db.collectionNames.remove

-------------------索引-----------------------------------------------

索引是对数据表中一列或多列的值进行设置索引可以让查询速度更快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值