Node.js学习笔记----day01
认真学习,认真记录,每天都要有进步呀!!!
加油叭!!!
一、Node.js的简介
- Node.js是什么
(1)Node.js不是一门语言
(2) Node.js也不是库,也不是框架
(3)Node.js是一个JavaScript运行时的脚本
简单的说 Node.js 就是运行在服务端的 JavaScript。可以解析和执行JS代码,是一个编写网络系统和Web应用程序的平台,围绕事件驱动的非阻塞编程模型构建的。Node.js使用事件驱动,非阻塞I/O模型,轻量、高效,可以完美地处理时时数据,运行在不同的设备上。并且Node.js基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好
- 使用NodeJS的场景:
(1)RESTful API
这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。
(2)统一Web应用的UI层
目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。
不讨论这种架构是好是坏,但是有另外一种实践,面向服务的架构,更好的做前后端的依赖分离。如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面。
(3)大量Ajax请求的应用
例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,NodeJS能响应大量的并发请求。总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。
- Node.js中的JS与浏览器中的JS的区别:
浏览器中的JS:
- EcmaScript
- BOM
- DOM
Node.js中的JS:
- 有EcmaScript
- 没有BOM
- 没有DOM
二、安装Node环境
安装
解压文件,一路 Next ,如果想要更改默认路径的话,就得配置一下环境变量
3. 查看Node版本
$ node --version 或者 node -v
三、Hello World
- 创建编辑JavaScript脚本文件
demo.js
console.log("Hello World!");
- 打开终端,定位脚本文件所属目录
- 输入node 文件名,执行对应的文件
注意:文件名不要使用 node.js 来命名(最好不要使用中文)
栗子:
程序执行后,正常的话,就会在终端输出 Hello World!
四、Node操作文件
Node 读取文件
浏览器中的 JavaScript 是没有文件操作的能力的,但是 Node 中的 JavaScript 具有文件操作的能力
- 使用 require 方法加载 fs 核心模块
var fs = require('fs')
解释:
fs 是 file-system 的简写,就是文件系统的意思
在 Node 中如果想要进行文件操作,就必须引入 fs 这个核心模块
在 fs 这个核心模块中,就提供了所有的文件操作相关的 API
例如:fs.readFile 就是用来读取文件的
- 读取文件
fs.readFile(参数一, 参数二)
解释:
参数一:就是要读取的文件路径
参数二:是一个回调函数
- 栗子:
test.txt
你好呀,我是一个test文件。
demo02.js
var fs = require('fs')
fs.readFile('./test.txt', function (error, data) {
console.log(error)
console.log(data)
})
终端打印结果:
如果是读取一个不存在的文件
var fs = require('fs')
fs.readFile('./test1.txt', function (error, data) {
console.log(error)
console.log(data)
})
终端打印结果:
结论:
读取文件成功:
error null
data 数据
读取文件失败:
error 错误对象
data undefined没有数据
注意:
可以看到,终端给我们返回的数据并不是test.txt中我们想要的数据
文件中存储的其实都是二进制数据 0 1
这里为什么看到的不是 0 和 1 呢?原因是二进制转为 16 进制了
但是无论是二进制01还是16进制,人类都不认识
所以我们可以通过 toString 方法把其转为我们能认识的字符
如图:
读取文件及简单的错误处理:
// 在回调函数中利用if语句通过判断 error 来确认是否有错误发生
if (error) {
console.log('读取文件失败了')
} else {
console.log(data.toString())
}
Node写入文件
- 使用 require 方法加载 fs 核心模块
var fs = require('fs')
- 写入文件
fs.writeFile(参数一, 参数二,参数三)
解释:
参数一:文件路径
参数二:文件内容
参数三:回调函数
- 栗子:
demo03.js
var fs = require('fs')
fs.writeFile('./test03.md', '大家好,给大家介绍一下,我是Node.js', function (error) {
if (error) {
console.log('文件写入失败')
} else {
console.log('文件写入成功')
}
})
打印结果:
五、使用Node去搭建一个简单的Web服务器
- 加载 http 核心模块
var http = require('http')
- 使用 http.createServer() 方法创建一个 Web 服务器
var server = http.createServer()
- 服务器要干嘛?
提供服务:对 数据的服务
发请求
接收请求
处理请求
给个反馈(发送响应)
注册 request 请求事件
当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
server.on('request', function () {
})
//参数一: 注册request请求
//参数二:回调函数
- 绑定端口号,启动服务器
server.listen(3000, function () {
})
//参数一:端口号
//参数二:回调函数
栗子:
var http = require('http')
var server = http.createServer()
server.on('request', function () {
console.log('收到客户端的请求啦')
})
server.listen(3000, function () {
console.log('服务器响应成功啦')
})
通过 http://127.0.0.1:3000/ 或者是 http://localhost:3000/ 访问
当在地址栏中访问一次
http://localhost:3000/
终端就会打印一次 “收到客户端的请求啦”
每访问一次,服务器就会响应一次
六、发送响应
- 加载 http 核心模块
var http = require('http')
- 使用 http.createServer() 方法创建一个 Web 服务器
var server = http.createServer()
- 服务器要干嘛?
server.on('request', function (request, response) {
})
在 server.on() 的 request 请求事件处理函数中需要接收两个参数:
参数一: Request 请求对象
请求对象可以用来获取客户端的一些请求信息,例如请求路径
获取请求路径的方法 : request.url
参数二:Response 响应对象
响应对象可以用来给客户端发送响应消息
给客户端发送响应数据的方法: response.write
write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待
结束响应: response.end()
- 绑定端口号,启动服务器
server.listen(3000, function () {
})
//参数一:端口号
//参数二:回调函数
栗子:
demo05.js
var http = require('http')
var server = http.createServer()
server.on('request', function (request, response) {
console.log('收到客户端的请求啦')
console.log('请求的路径是:' + request.url)
response.write('hello')
response.write(' nodejs')
response.end()
// 上面的方式比较麻烦,推荐使用更简单的方式,直接 end 的同时发送响应数据
// res.end('hello nodejs')
})
server.listen(3000, function () {
console.log('服务器启动成功啦')
})
七、根据不同请求路径返回不同数据的简单操作
demo06.js
var http = require('http')
var server = http.createServer()
server.on('request',function(req,res){
console.log('收到客户端请求啦。。。')
var url = req.url
if(url == '/'){
res.end('index page')
}else if(url == '/login'){
res.end('login page')
}else if(url == '/logout'){
res.end('logout page')
}else{
res.end('404 Not Found')
}
})
server.listen(3000,function(){
console.log('服务器启动成功。。。')
})
来吧展示:
八、Node中的核心模块
- os(操作系统)核心模块
os 模块提供了操作系统相关的使用方法
Node.js官方os模块方法中文文档地址
http://nodejs.cn/api/os.html
栗子:
var os = require('os');
//os.hostname() 方法以字符串的形式返回操作系统的主机名。
console.log('主机名'+os.hostname());
//os.cpus() 方法返回一个对象数组,包含每个逻辑 CPU 内核的信息。
console.log('本机CPU'+os.cpus());
//os.platform() 方法返回一个字符串,指定 Node.js 编译时的操作系统平台。
console.log('本机操作系统平台'+os.platform());
//os.type() 方法返回一个字符串, 返回的操作系统的名字。
console.log('本机操作系统:'+os.type())
来吧展示:
- path(路径)核心模块
path 模块提供用于处理文件路径和目录路径的实用工具。
Node.js官方path模块方法中文文档地址:http://nodejs.cn/api/path.html
栗子:
var path = require('path');
var testData = 'D:/node/demo/index.html';
//path.basename() 方法返回 path 的最后一部分,
console.log(path.basename(testData));
//path.dirname() 方法返回 path 的目录名,即除去最后一部分的所有路径
console.log(path.dirname(testData));
//path.extname() 方法返回 path 的扩展名
//从最后一次出现 .(句点)字符到 path 最后一部分的字符串结束。
console.log(path.extname(testData));
//path.parse() 方法会返回一个对象,其属性表示 path 的有效元素。
console.log(path.parse(testData));
//path.isAbsolute() 方法检测 path 是否为绝对路径。
console.log(path.isAbsolute(testData));
来吧展示:
- URL核心模块
url 模块用于处理与解析 URL.
NodeJs官方url模块方法中文文档地址:http://nodejs.cn/api/url.html
https://www.cnblogs.com/smile-xin/p/11614719.html
3.1 url.parse()
var url=require('url');
var data='http://demo.cn?name=千夏&age=18';
console.log(url.parse(data))
console.log(url.parse(data).query)
3.2 url.pathname()
获取url的路径部分
var myURL1 = new URL('https://demo.cn');
console.log(myURL1.pathname);
var myURL2 = new URL('https://demo.cn/abc');
console.log(myURL2.pathname);
var myURL3 = new URL('https://demo.cn/abc/def');
console.log(myURL3.pathname);
var myURL4 = new URL('https://demo.cn/abc/def?name=zs');
console.log(myURL4.pathname);
来吧展示:
设置url的路径部分
var myURL = new URL('https://demo.cn/abc');
myURL.pathname = '/xxx';
console.log(myURL.href);
var myURL2 = new URL('https://demo.cn/abc/def');
myURL2.pathname = '/yyy';
console.log(myURL2.href);
来吧展示:
3.3 url.search()
获取及设置 URL 的序列化查询部分。
var myURL = new URL('https://demo.cn/abc?name=zs&age=18');
console.log(myURL.search);
// 打印 ?name=zs&age=18
myURL.search = 'num=10';
console.log(myURL.href);
// 打印 https://example.org/abc?num=10
来吧展示:
九、 http中的Content-Type
Content-Type
服务器最好把每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉
不同的资源对应的 Content-Type 是不一样,具体参照:
http://tool.oschina.net/commons
对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
通过网络发送文件
发送的并不是文件,本质上来讲发送是文件的内容
当浏览器收到服务器响应内容之后,就会根据你的 Content-Type 进行对应的解析处理
栗子:
var http = require('http')
var server = http.createServer()
server.on('request', function (req, res) {
var url = req.url
if (url === '/plain') {
// text/plain 就是普通文本
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('hello 文本')
} else if (url === '/html') {
// 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end('<h3>hello html</h3> <a href="">我是a标签</a>')
}
})
server.listen(3000, function () {
console.log('Server is running...')
})
来吧展示:
根据不同的url地址分别读取html文件与图片的小小栗子:
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.on('request', function (req, res) {
var url = req.url
if (url === '/') {
// 我们要发送的还是在文件中的内容
fs.readFile('./index.html', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('文件读取失败,请稍后重试!')
} else {
// data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
// res.end() 支持两种数据类型,一种是二进制,一种是字符串
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(data)
}
})
} else if (url === '/img') {
// url:统一资源定位符
// 一个 url 最终其实是要对应到一个资源的
fs.readFile('./img.jpg', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('文件读取失败,请稍后重试!')
} else {
// data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
// res.end() 支持两种数据类型,一种是二进制,一种是字符串
// 图片就不需要指定编码了,因为我们常说的编码一般指的是:字符编码
res.setHeader('Content-Type', 'image/jpeg')
res.end(data)
}
})
}
})
server.listen(3000, function () {
console.log('Server is running...')
})
index.html
<h1>首页</h1>
来吧展示:
十、什么是模块化
十一、加载与导出
- 加载 require ()方法
require 方法有两个作用:
(1) 加载文件模块并执行里面的代码
(2)拿到被加载文件模块导出的接口对象
- 导出
Node中是模块作用域,默认文件中所有的成员只在当前文件模块有效
对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports
接口中就可以了
在每个文件模块中都提供了一个对象:exports
exports 默认是一个空对象
你要做的就是把所有需要被外部访问的成员挂载到这个 exports 对象中
2.1 导出多个成员
导出多个成员,拿到的就是函数,字符串
exports.age = 123
exports.hi= 'hello'
exports.func = function(){
console.log('aaa')
}
exports.message={
name:'zs'
}
也可以这样来导出多个成员
module.exports = {
add = function(){
return x + y
},
str:'hello'
}
栗子:
a.js
var bExports = require('./b')
console.log(bExports.foo)
//打印 hello
console.log(bExports.add(10, 20))
// 打印 30
console.log(bExports.age)
//打印 18
b.js
var foo = 'aaa'
exports.foo = 'hello'
function add(x, y) {
return x - y
}
exports.add = function (x, y) {
return x + y
}
var age = 18
exports.age = age
2.2 导出单个成员
module.exports = 'hello'
以下情况会覆盖
module.exports = 'hello'
module.exports = function(x,y){
return x + y
}
Node.js学习笔记----day01的更多相关文章
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
- Node.js学习笔记(4):Yarn简明教程
Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...
- Node.js学习笔记(一)
1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...
- Node.js学习笔记(一):快速开始
最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...
- Node.js学习笔记(一)基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- node.js学习笔记(三)——事件循环
要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...
随机推荐
- 带你了解NLP的词嵌入
摘要:今天带领大家学习自然语言处理中的词嵌入的内容. 本文分享自华为云社区<[MindSpore易点通]深度学习系列-词嵌入>,作者:Skytier. 1 特征表示 在自然语言处理中,有一 ...
- 【题解】CF356A Knight Tournament
题面传送门 本蒟蒻想练习一下并查集,所以是找并查集标签来这里的.写题解加深理解. 解决思路 自然,看到区间修改之类很容易想到线段树,但本蒟蒻线段树会写挂,所以这里就讲比较简单的并查集思路. 并查集的核 ...
- Vue+Go前端后端一体化 企业级微服务网关项目
Vue+Go前端后端一体化 企业级微服务网关项目(~11) 课程目录: 第1章 拒绝培训机构烂大街项目,冲刺Offer首选[Vue+Go,稀缺组合,赶快上车!]1-1 摒弃千篇一律项目,选我:前后端一 ...
- 1759D(数位变0)
题目链接 题目大意: 给你两个整数n, m.你需要求一个数,它满足如下条件: 是n的整数倍,且倍数小于m. 你应该使其末尾的0尽可能的多(如100后面有2个零,1020后面有一个零,我们应该输出100 ...
- Codeforces Round #834 (Div. 3) A-G
比赛链接 A 题目 知识点:模拟. 确定开头字母,然后循环比较即可. 时间复杂度 \(O(n)\) 空间复杂度 \(O(n)\) 题解 #include <bits/stdc++.h> # ...
- Seata 1.5.2 源码学习(事务执行)
关于全局事务的执行,虽然之前的文章中也有所涉及,但不够细致,今天再深入的看一下事务的整个执行过程是怎样的. 1. TransactionManager io.seata.core.model.Tran ...
- 再见CMS
观察网站最下方,根据备案号搜到这是个齐博CMS,然后百度就可以搜到齐博CMS漏洞了 然后开始利用 首先尝试了在用户信息修改处进行注入,发现好像想不通了,就在博客界面进行注入 Payload: 获取版本 ...
- 关于js更改编码问题
前言 前几天调试喜马拉雅的js加密算法,找到固定一段加密算法后调试,发现结果与实际不一致,后来发现是js显示的编码不一致,而我用的密钥是直接通过 chrome控制台复制下来的,这就导致最后结果不一致. ...
- 【接口测试】Postman(一)--接口测试知识准备
1.0 前言 应用程序编程接口(Application Programming Interface, API)是这些年来最流行的技术之一,强大的Web应用程序和领先的移动应用程序都离不开后端强大的 ...
- SVNAdmin2 - 基于web的SVN管理系统
1. 介绍 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序. 正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权 ...