//****************************************************
Node特点:
异步非阻塞I/O
事件与回调函数
单线程
跨平台
//****************************************************
一个单独的文件就是一个模块,模块内将需要对外暴露的变量放到exports对象里,可以是任意对象,函数,数组等,未放到exports对象里的都是私有的。用require方法加载模块,即读取模块文件获得exports对象。
//****************************************************
NPM是随同NodeJS一起安装的包管理工具
npm常见命令
install
uninstall
update
list
view
package.json
定义了一个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)
//****************************************************
node.js可以解析js代码(没有浏览器安全级别的限制),提供很多系统级别的api,如:文件的读写、进程的管理、网络通信。。。。
//****************************************************
热更新:每次的修改等操作 不用再在终端中进行操作 ,刷新页面即可
安装 npm install nodemon -g
启动 nodemon xxxx.js
可以不用执行node,自动更新
搭建第一个服务器
一,自定义模块
html.js
//1.内置模块2.第三方模块3.自定义模块
//用一个变量或者常量去接收模块暴露的内容
const { doAdd } = require("./doAdd.js");
//obj1 => {doAdd:function(){}}
/* {doAdd}=>{doAdd:function(){ //解构赋值
}} */
const obj2 = require("./doMulti.js");
//复合运算
function exec(a, b) {
console.log(doAdd(a, b), obj2.doMulti(a, b));
}
exec(10, 20);
在编辑器的相应文件单击右键打开终端,
如果没有设置好路径要先设置到淘宝
“npm install -g cnpm --registry=https://registry.npm.taobao.org”,
然后安装热更新“npm install nodemon -g”,
然后运行文件输入 “node 文件名”,
然后启动热更新 “nodemon 文件名”
二.内置模块
url
操作:--require(‘url’)
node
url——提供很多方法
url.parse(urlString)查询url信息,将url字符串解析成对象
url.format(urlObject)将信息解析成正常的url地址
url.resolve(from, to)将两个url解析成一个完整的url 返回从根目录指定到当前目录的绝对路径url,一个标准的url格式
const url = require("url");
//parse 将url字符串解析成对象
/* let urlstr = "http://www.test.com:3000/a/b/index.js?username=admin";
let urlobj = url.parse(urlstr);
console.log(urlobj); */
//format 将一个对象转换成一个url字符串
/* let urlobj = {
protocol: "https",
port: 5000,
host: "www.example.com",
};
console.log(url.format(urlobj));
*/
//resolve
let url1 = url.resolve("/one/two/three", "/four");
let url2 = url.resolve("http://example.com/", "/one"); // 'http://example.com/one'
let url3 = url.resolve("http://example.com/one/", "/two");
console.log(url3);
http
const http=require('http');
http.createServer((req,res)=>{
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
res.end("<h1>干嘛</h1>");
}).listen(3000,"127.0.0.1");
const http = require("http");
http
.createServer((req, res) => {
//res.end("hello nodeJS");//响应结束并返回对应的数据
res.writeHead(200, { "content-type": "text/html;charset=utf-8" });
res.end("<h1>响应内容</h1>");
})
.listen(3000, "127.0.0.1");
events
events 对事件进行处理的方法—require(‘events’)
on 注册事件
emit 发布事件
once 执行一次
const Events = require("events");
let evt = new Events();
evt.on("loginSuccess", function () {
console.log("登录成功");
});
//evt.emit("loginSuccess");
//evt.once("loginSuccess");
evt.once("loginSuccess", function () {
console.log("Aa");
});
evt.emit("loginSuccess");
evt.emit("loginSuccess");
fs
fs(file system)跟文件相关的方法—require(‘fs’)
1)stat(url,fc(err,stats)) 获取文件的一些信息 isFile()
2)mkdir() 新增目录的
3)writeFile(url,con,fc) 书写文件 覆盖
4)appendFile(url,con,fc) 追加文件内容 添加
5)读取文件的内容:readFile(url,fc)
6)列出目录的东西:readdir
7)重命名目录或文件:rename
8)删除目录与文件:rmdir(目录),unlink(文件)
readdirSync(src) 同步读取目录信息
单词后面加Sync 就可以不用写function
const fs = require("fs");
//************************************************
fs.stat("./data.json", (err, stats) => {
if (err) {
return;
}
console.log(stats);
console.log(stats.isFile());
});
//************************************************
fs.mkdir("test1", (err) => {
console.log(err);
});
//************************************************
fs.writeFile("./data.json", "[1,2,3]", (err) => {});
//************************************************
fs.appendFile("./data.json", "aaa", (err) => {
if (err) return;
});
//************************************************
fs.readFile("./index.html", (err, con) => {
console.log(con.toString());
});
//************************************************
fs.readdir("./test1", (err, con) => {
console.log(con);
});
//************************************************
fs.rename("./test", "./test2", (err, con) => {});
//************************************************
fs.rmdir("./test1", (err, con) => {
console.log(err);
});
//************************************************
fs.unlink("./data.json", (err, con) => {});
//************************************************
fs.readdir("test1", (err, con) => {
if (err) return;
con.forEach((item) => {
fs.unlink("test1/" + item, (err, con) => {});
});
fs.rmdir("test1", () => {});
});
//************************************************
let con = fs.readFileSync("index.html");
console.log(con);
queryString
用于解析与格式化 URL 查询字符串-require(‘querystring’)
querystring.escape(str)解析对象,字符串(汉字)
querystring.parse(str[, sep[, eq[, options]]])转换成对象
querystring.stringify(obj[, sep[, eq[, options]]])转换成字符串
querystring.unescape(str)解析escape转换的编码,解析成汉字
const qs = require("querystring");
let str = "username=胡亮亮&password=111";
//let obj = qs.parse(str);
//console.log(obj);
//console.log(qs.stringify(obj));
console.log(qs.escape(str));
console.log(qs.unescape(qs.escape(str)));
const qs=require("querystring");
let str="username=胡亮亮&password=111";
http和fs的组合
1.先创建三个html页面,命名分别为index.html、login.html、404.html 页面内容随便写
2.写一个js文件,命名可随便 ,如:server.js
//路由
const http = require("http");
const fs = require("fs");
http
.createServer((req, res) => {
res.writeHead(200, { "content-type": "text/html;charset=utf-8" });
//先取路径(客户端请求的资源)
let url = req.url;
if (url == "/index.html" || url == "/") {
// readFile后面加Sync 就可以不用写第二个参数回调函数
let con = fs.readFileSync("index.html").toString();
res.end(con);
} else if (url == "/login.html") {
let con = fs.readFileSync("login.html").toString();
res.end(con);
} else {
let con = fs.readFileSync("404.html").toString();
res.end(con);
}
})
.listen(3000, "localhost");
3.然后在vscode编辑器中单击相应文件夹,打开终端,然后运行文件:node 文件名