Node.js介绍
- Node.js是一个JavaScript运行环境。它让JavaScript可以开发后端程序。它几乎能实现其他后端语言能实现的所有功能。
- Node.js是基于Google V8引擎,V8 引擎室Google发布的一款开源的JavaScript引擎,原来主要用于Chorme浏览器的js解释部分,但是作者鬼才般的将这个V8引擎搬到了服务器,用于做服务器的软件。
Node.js最擅长高并发
- Node.js最擅长处理高并发,在Java、PHP或者.net等服务器语言中,会为每一个客户端创建一个新的线程,而每个线程需要耗费大约2MB内存,也就是说,理论上一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。想要让WEB应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件自然就上升了。Node.js不为每一个客户连接创建一个新的线程,而仅仅使用一个线程,当有用户连接了,就触发一个内部事件,通过非阻塞I/O、时间驱动机制,让Node.js程序宏观上也是并行的。使用node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。
Node.js可实现的功能多
- Node.js不仅可以像其他后端语言一样写动态网站、写接口、还可以应用在云计算平台、游戏开发、区块链开发、即时通讯、跨平台App开发、云直播等。
Node.js创建第一个应用
- 如果我们使用PHP来编写后端代码时,需要Apache或者Nginx的HTTP服务器,来处理客户端的请求响应,不过对node.js来说,概念完全不一样了,使用node.js时,我们不仅仅在实现一个应用,同时还能实现了整体HTTP服务器。
nodeJs中的模块
http模块
- 引入http模块
var http = require('http')
创建服务器
- 输入
node-http-server创建一个服务器
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html'})
response.write('<head> <meta charset="UTF-8"> </head>')
response.write('你好,世界')
response.end('hello world')
}).listen(8081)
request 接收浏览器获取url的信息
request.method 获取请求类型
response 给浏览器相应信息
response.writeHead 设置响应头,状态码是200,编码是text/html(这个输入页面配合mate可以解决乱码)
response.write('<head> <meta charset="UTF-8"> </head>')解决乱码
response.end 表示给我们页面上面输出一句话,并且结束响应
listen(8081) 表示服务器的端口号
- 运行服务器,node 文件名.js
url模块
获取url信息
url.parse()解析url.parse(url,true) 现已被弃用使用以下两种方法替换,如果没有传第二个参数true,则会返回未解析乱码的字符串,如果写true返回的是解析的对象。
- 引入querystring
const querystring = require('querystring')
let url = 'http://127.0.0.1:8081/?name=张三&age=23'
let params = querystring.parse(url.split("?")[1])
console.log(params)
- 创建一个URL实例,使用searchParams.get获取
let url = 'http://127.0.0.1:8081/?name=张三&age=23'
let data = new URL(url)
let params = data.searchParams.get(url.split('?')[1])
console.log(params)
common.js模块 文件导出引入
- 导出
- exports.api = obj
- moudle.exports = obj
- exports.fn = function(){}
- 打开package.json文件,在script的对象下面添加
"start":"nodemon app.js"
- 启动项目
npm start
fs模块
fs.stat 检测是文件还是目录
fs.stat('./package.json', (err, data) => {
if (err) {
console.log(err, data, 567);
return
}
console.log(data.isFile());
console.log(data.isDirectory());
});
fs.mkdir 创建目录
fs.mkdir('./css', (err, data) => {
console.log('创建成功');
})
fs.writeFile 创建写入文件
fs.writeFile('./css/index.css', 'body {color:red}',(err, data) => {
console.log('创建成功');
})
fs.appendFile 追加文件
fs.appendFile('./assets/css.css','body {color : red}' , (err, data) => {
console.log(data.toString());
return
})
fs.readFile 读取文件
fs.readFile('./package.json', (err, data) => {
console.log(data.toString());
return
})
fs.readdir 读取目录
fs.readdir('./css', (err, data) => {
console.log(data);
return
})
fs.rename 重命名
fs.rename('./css', './asset', (err, data) => {
console.log(data);
return
})
fs.rmdir 删除目录
fs.unlink 删除文件
fs.unlink('./asset/css.css', (err, data) => {
console.log(data);
return
})
从文件流中读取数据
const fs = require('fs')
let readStream = fs.createReadStream('./index.html')
let str = ''
let count = 0
readStream.on('data', data => {
str += data
count++
})
readStream.on('end', () => {
console.log(count, str, '239');
})
readStream.on('error',(err)=>{
})
createWriteStream以流的方式写入文件
let writeStream = fs.createWriteStream('index.text')
writeStream.write('你好,的十分士大夫撒会发生开发杀害算法撒旦和骷髅法师','utf-8')
writeStream.end()
writeStream.on('finish', () => {
console.log('写入完成');
})
writeStream.on('error', () => {
console.log('写入错误');
})
管道流
let readerStream = fs.createReadStream('moto.jpg')
let writeStream = fs.createWriteStream('./asset/moto.jpg')
readerStream.pipe(writeStream)
console.log('管道读写完成')
path 模块
获取后缀名
npm 安装的版本号
^ 表示第一位版本号不变,后面两位数取最新
~ 表示前两位不变,最后一个取最新
* 表示全部取最新
Node.js热更新方案
supervisor插件
- 插件安装和使用方法
npm i -g supervisor
- 启动node项目命令
supervisor app.js
nodemon插件
创建文件夹的插件mkdirp
- 比原生mkdir功能更强大
- 下载
npm i mkdirp
- 使用的两种方法
const mkdirp = require('mkdirp')
const made = mkdirp.sync('/tmp/foo/bar/baz')
console.log(`made directories, starting with ${made}`)
mkdirp('/tmp/foo/bar/baz').then(made =>
console.log(`made directories, starting with ${made}`))
利用node.js创建一个静态的web服务器
const fs = require('fs');
var http = require('http');
const path = require('path')
const common = require('./common')
http.createServer(function (req, res) {
console.log(req.url, 'req3456');
let pathName = req.url
pathName = pathName == '/' ? '/index.html' : pathName
console.log(pathName, 'reds');
if (pathName != '/favicon.ico') {
fs.readFile('.' + pathName, (err, data) => {
if (err) {
res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' })
res.end('页面不存在');
return
}
let extName = path.extname(pathName)
let type = common.getMime(extName)
res.writeHead(200, { 'Content-Type': '' + type + ';charset="utf-8"' })
res.end(data);
})
}
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');
routes路由
- 路由是由一个URL和一个特定的HTTP方法(get、post等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。通俗的讲:路由指的是针对不同请求的URL,处理不同的业务逻辑
初识EJS模块引擎
- EJS是后台模板,可以把我们数据库和文件读取的数据显示到HTML页面上面,它是一个第三方模块,需要通过npm安装引入。
- 安装ejs模块
- 使用ejs
let msg = '数据库里面获取的数据'
let list = [{ title: 1 }, { title: 2 }, { title: 3 }, { title: 4 }, { title: 5 }, { title: 6 }]
ejs.renderFile('./views/login.ejs', { msg: msg, list: list }, (err, data) => {
res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' })
res.end(data)
<h3>
<%=msg%>
</h3>
<ul>
<%for(var i=0;i<list.length;i++){%>
<li>
<%=list[i].title%>
</li>
<%}%>
</ul>
get post
- get从指定的资源请求数据,一般用于获取数据
- post向指定的资源提交要被处理的数据,一般用于提交数据
获取get传值
let params = url.parse(res.url,true);
params.query
获取post传值