nodeJS
一、nodeJS的介绍
- NodeJS不但自己可以完成服务器软件的功能,也不再需要php,asp,jsp等传统的服务器语言
- nodeJS可以解析JS代码,而没有浏览器安全级别的限制,因为,它的运行可以脱离浏览器的环境,而是在服务端运行;提供了很多系统级别的API,如:
文件的读写
进程的管理
网络通信 - NodeJS的包管理器npm,成为世界上最大的开放源代码的生态系统。
二、环境搭建
1、下载:
进入nodeJS官网(https://nodejs.org/en/),中文官网(http://nodejs.cn/)进行下载
2、安装:
windows环境下安装,没有特殊的,只需要全部下一步即可。
3、配置环境变量:
https://blog.csdn.net/jiang7701037/article/details/80707786(百度)
三、COMMONJS模块化规范
commonJS的模块化是后端的模块化规范,nodeJS使用的就是commonJS规范。
1、引入别的模块:require
1)、引入官方模块和第三方模块时,不需要写路径
const http = require('http');//引入http模块
2、引入自定义模块需要写路径:
const routes = require("./routes/index");//表示引入当前路径下的routes文件夹下的index模块(文件)const p = require("./person.js");//表示引入当前路径下的routes文件夹下的index模块(文件)
2、对外导出:module.exports
对外导出,就是对外暴露,可以暴露基本类型的变量,对象,函数等等。
1)、对外导出一个:
//person.js
var p = {
id : "007",
name :"张三丰",
work:function(str){
return this.name+"在努力地敲代码";
},
add:function(n1,n2){
return n1+n2;
}
}
//模块接口暴露
module.exports = p; //外部可以使用p对象里的所有属性和方法
2)、对外导出多个:
//person.js
var p = {
id : "007",
name :"张三丰",
work:function(str){
return this.name+"在努力地敲代码";
},
add:function(n1,n2){
return n1+n2;
}
}
//模块接口暴露
module.exports.work = p.work; //表示外部只能使用work函数
module.exports.add = p.add;//表示外部只能使用add函数
四、nodeJS搭建web服务器
const http = require(‘http’);//引入http模块
const hostname ='127.0.0.1';//服务器地址
const port = 706;//服务器的端口号
const server = http.createServer((request,response)=>{//使用http来创建服务器,
response.statusCode=200;
response.setHeader('Content-Type','text/plain');
response.end('hello nodeJS\n');
});
server.listen(port,hostname,()=>{//服务器监听
console.log(`Server running at http://${hostname}:${port}/`);
});
1)启动服务器: 在命令行窗口输入命令:node server.js
2)在浏览器输入 http://localhost:706/
五、内置模块 http , fs , path (根据情况进行讲解)
1、http
http模块主要完成和前端交互(还可以完成请求其它服务器),http模块对外暴露的是对象。
方法:
- createServer(function(request,response){}): 创建服务器**
- get(): 发送get请求,获取地址对应的数据(主要是获取其它服务器的数据)。
- request():如何抓取异步的数据
使用Http模块搭建服务器的步骤
1)、引入http模块
let http = require('http')
2)、创建web服务 返回http对象
let app = http.createServer((req,res)=>{
req 请求体(请求对象) 浏览器->服务器
req.url 地址 提取地址栏数据
req.on('data') 提取非地址栏数据 所有的http[s]都会触发end事件
req.on('end')
res 响应体(响应对象) 服务器->浏览器
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});响应头设置
res.write(字符/数据<string><buffer>) 返回数据
res.end() 结束响应 必须
})
3)、监听服务器
app.listen(端口,[地址],[回调])
监听成功,回调一次
端口: 1-65535 1024以下系统占用
虚拟地址localhost 真实域名xx.duapp.com
4)、启动服务器的命令:
node 文件名
热部署和启动命令
由于,每次更新代码后, 需要重新启动服务器,很麻烦
推荐命令行工具:
supervisor
或者nodemon
安装方式:
npm install supervisor -g
或者npm install nodemon -g
启动服务器 nodemon 文件名
2、静态资源托管(fs模块)
2.1)介绍
fs:fileSystem; 这个模块可以读取文件的内容,给文件写内容,创建文件夹,删除文件夹等等有关文件和文件夹的一切操作。
一般来说,前端的如下代码都会请求一个静态资源
<a href=".."></a>
<img src="..."/>
location.href="..."
body{
background:url(....)
}
后端资源读取静态资源文件就要使用fs模块
fs.readFile(文件名,[编码方式],回调(err,data));
2.2) fs模块使用
读取文件
- 异步的方式:
fs.readFile('文件路径',[编码方式],(err,data)=>{})
[^err ]: err 错误 ,null没有错误
- 同步的方式:
let data = fs.readFileSync('文件路径')
处理错误
try{
要排错的代码
}catch(e){
}
更名
fs.renameSync('改前','改后');
删除
fs.unlinkSync('文件路径')
3 path系统模块
操作系统磁盘路径
windows: c:\user\admin
磁盘的路径的分割是: \ 网络上的路径分割是 /
mac: ~/desktop/1901
API
磁盘路径解析 parse
path.parse('c:\\wamp\\xx.png') // string -> object
//返回
{
root: 'c:\\', 盘符
dir: 'c:\\wamp', 目录
base: 'xx.png', 文件名
ext: '.png', 扩展名
name: 'xx' 文件,不含扩展名
}
片段合并join
path.join('磁盘路径1','磁盘路径2','磁盘路径n')
__dirname 魔术变量 返回当前文件所在的磁盘路径
片段合并 resolve
path.resolve('磁盘路径1','磁盘路径n')
合并磁盘片段,右到左找,如果找到了根,那就不再朝前找了;拼接时,是从左到右拼接,如果没有给根路径,以当前文件路径为根(即默认:加上 __dirname)。
六、Nodejs路由搭建
1、概念:
路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
即:根据前端请求路径,调用不同的函数,就是引路者的角色
2、代码:
//1、server.js
var http = require('http');
var url = require('url');
var router = require('./router/index');//包含路由设置的模块
var server = http.createServer((request,response)=>{
response.writeHeader(200,{"Content-type":"text/html;charset=utf-8"});
if(request.url!=='/favicon.ico'){
var pathName = url.parse(request.url).pathname.replace(/\//,'');
console.log(pathName);
try{
router[pathName](request,response);
}catch(err){
router['error'](request,response);
}
}
response.write("hello,我来自nodeJS");
response.end();
});
server.listen(8000);
console.log("server listen localhost:8000");
//2、./router/index.js
let file = require("./file");
module.exports = {
…………
//读取图片文件
"img":function(request,response){
file.readImg("img/2.jpg",response);
},
//读取html文件。
"index":function(request,response){
file.readHTML("index.html",response);
}
};
//3、./file.js
路由模块文件(file.js):
var fs = require('fs');
module.exports = {
readImg: function (file, res) {
fs.readFile(file, 'binary', function (err, data) {
if (err) throw err
res.writeHead(200, {'Content-Type': 'image/jpeg'})
res.write(data, 'binary')
res.end()
})
},
readHTML: function (fileName, res) {
fs.readFile(fileName, 'utf8', (err, data)=> {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'})
res.write(data, 'utf8')
res.end()
});
}
}
七、nodemon 测试工具使用
热部署和启动命令
由于,每次更新代码后, 需要重新启动服务器,很麻烦
推荐命令行工具:
supervisor
或者nodemon
安装方式:
npm install supervisor -g
或者npm install nodemon -g
启动服务器 nodemon 文件名
八、npm , nrm 工具使用;
1、npm
介绍:
npm是Node.js的包管理工具(nodeJS package manager)。
1)、 安装第三方模块:
npm install 模块名 参数(可选:-g --save-dev --save)
-g: golbal,全局安装; 跟操作系统安装软件,跟安装qq,微信等工具是一个意思。
–save-dev:本地安装(开发依赖)
–save:本地安装(生产依赖)
2)、卸载第三方模块:
npm uninstall 模块名 参数(可选:-g --save-dev --save)
2、nrm
可以选择npm的服务器来源(选择最快的源进行安装)
npm install nrm -g 安装选择源的工具包
nrm ls 查看所有源
nrm test 测试所有源,可以看到当前哪个源的速度快
nrm use 切换源名 ,切换到最快的源