重要:Node.js v10.15.1中文api文档http://nodejs.cn/api/
1、用户→apache、Nginx、Tomact→php;用户→nodejs。
2、nodejs中将有很多的功能,划分为一个个mudule,大陆翻译为模块。这是因为有一些程序需要使用fs(文件读取)功能,有一些不用,所以为了效率,你用啥,你就require啥。
3、http模块:
var http = require("http");
//创建一个服务器,回调函数表示接收到请求之后做的事情。req请求,res响应。
var server = http.createServer(function(req,res){
console.log("服务器接收到请求"+req.url);
//若是没有res.end则浏览器一直转圈。
res.end("");
});
//监听接口
server.listen(3000,"127.0.0.1");
4、req里面可以使用的东西。最关键的是req.url属性,表示用户请求url地址。所有路由的设计,都是通过req.url来实现的。
我们关心的不是拿到url而是识别url。识别url,用到两个模块,一个是url模块,另一个querystring是模块。字符串查询用querystring。
5、url.parse()用法
该文件创建在H盘nodedemo文件夹下,命名为04_req.js
var http = require("http");
var url = require("url");
var server = http.createServer(function(req,res){
//url.parse()可以将一完整的url地址,分为多个部分
//host、port、pathname、path、query
var pathname = url.parse(req.url).pathname;
//url.parse()如果第二个参数为true那么可以将查询变为对象
var query = url.parse(req.url,true).query;
//就可以直接打点得到这个参数
var age = query.age;
console.log("pathname:"+pathname);
console.log(query);
console.log("age:"+age);
res.end("");
});
server.listen(3000,"127.0.0.1");
结果图:
H:\nodedemo>node 04_req.js
pathname:/abcd/adst/1.html
[Object: null prototype] { id: '123', sex: 'man', age: '18' }
age:18
6、当用户访问/student/1234567890的查询此学号的学生信息,当用户方位/teacher/645433的时候,查询此老师的信息。其他时,提示错误。若是位数不对,也是提示位数不对。
var http = require("http");
var server = http.createServer(function(req,res){
var userurl = req.url;
res.writeHead(200,{"Content-Type":"text/html;charset=utf8"});
if(userurl.substr(0,9) == "/student/"){
var studentid = userurl.substr(9);
console.log(studentid);
if(/\d{10}/.test(studentid)){
res.end("您哟啊查询的学生信息id为:"+studentid);
}else{
res.end("学生学号位数不对。");
}
}else if(userurl.substr(0,9) == "/teacher/"){
var teacherid = userurl.substr(9);
if(/\d{6}$/.test(teacherid)){
res.end("您哟啊查询的学生信息id为:"+teacherid);
}else{
res.end("老师学号位数不对。");
}
}else{
res.end("请检查url");
}
});
server.listen(3000,"127.0.0.1");
7、fs模块以及事件环机制(经典案例)
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url == "/favicon.ico"){
return;
}
//不处理小图标,强行输入五位数。事件环不干扰其他人进入。
var userid = parseInt(Math.random()*89999)+10000;
console.log("欢迎"+ userid);
res.writeHead(200,{"Content-Type":"text/html;charset=gbk"});
//两个参数,第一个是完整路径,当前目录为./,第二个为回调函数
fs.readFile("./1.txt",function(err,data){
if(err){
throw err;
}
console.log(userid = "文件读取完毕");
res.end(data);
});
});
server.listen(3000,"127.0.0.1");
8、创建文件夹
在album中创建aaa文件夹。
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url == "/favicon.ico"){
return;
}
fs.mkdir("./album/aaa",function(err){
if(err){
return console.error(err);
}
console.log("目录创建成功。");
});
});
server.listen(3000,"127.0.0.1");
9、异步函数
在nodedemo文件夹下创建album以及11.js文件。然后在album文件夹下添加aaa文件夹、bbb文件夹和若干图片。
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url == "/favicon.ico"){
return;
}
//异步函数.干扰了全局变量。就是aaa文件还未执行完毕,就执行了bbb文件,并把bbb文件push进去了。
var wenjianjia = [];
fs.readdir("./album",function(err,files){
//files是文件名的数组不是文件的数组,表示./album这个文件夹中的所有东西
//包括文件以及文件夹
//console.log(files);
for(var i = 0;i<files.length;i++){
var thefilename = files[i];
//console.log(thefilename);
//又要一次检测
fs.stat("./album/" + thefilename,function(err,stats){
//如果是一个文件夹 就输入它
if(stats.isDirectory()){
wenjianjia.push(thefilename);
}
console.log(wenjianjia);
});
}
});
});
server.listen(3000,"127.0.0.1");
结果:
H:\nodedemo>node 11.js
[]
[]
[]
[]
[]
[]
[ 'bbb' ]
[ 'bbb', 'bbb' ]
10、把9中的异步函数变为同步函数
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url == "/favicon.ico"){
return;
}
//files:["0.jpg","1.jpg",.."aaa","bbb"]
//遍历album里面的所有文件以及文件夹
fs.readdir("./album/",function(err,files){
var wenjianjia = [];
//迭代器 强行把异步变为同步函数 1做完了 再做2,2做完了 再做3
(function iterator(i){
//防止越界。遍历结束
if(i == files.length){
console.log(wenjianjia);
return;
}
fs.stat("./album/" + files[i],function(err,stats){
//检测成功之后做的事情
if(stats.isDirectory()){
//如果是文件夹,放入数组。否什么都不做。然后迭代下一个
wenjianjia.push(files[i]);
}
iterator(i+1);
});
})(0);
});
res.end();
});
server.listen(3000,"127.0.0.1");
结果:
H:\nodedemo>node 12.js
[ 'aaa', 'bbb' ]
11、静态资源管理
在nodedemo中创建一个static文件夹,static文件夹下添加1.html、index.html和404.html文件以及images文件夹,images文件下添加一张0.jpg图片。
var http = require("http");
var url = require("url");
var fs= require("fs");
var path = require("path");
http.createServer(function(req,res){
//得到用户的路径
var pathname = url.parse(req.url).pathname;
//默认首页
if(pathname == "/"){
pathname = "index.html";
}
//拓展名
var extname = path.extname(pathname);
console.log(extname);
//真的去读取这个文件
fs.readFile("./static/"+pathname,function(err,data){
if(err){
console.log(1);
//r如果文件不存在404返回
fs.readFile("./static/404.html",function(err,data){
console.log(2);
res.writeHead(404,{"Content-Type":"text/html;charset=UTF8"});
res.end(data);
});
return; //不可少
}
//MIME类型就是 网页文件:txt/html.jpg文件:images/jpg
var mine = getMinme(extname);
res.writeHead(200,{"Content-Type":mine})
res.end(data);
});
}).listen(3000,"127.0.0.1");
function getMinme(extname){
switch(extname){
case ".html":{return "text/html";} break;
case ".jpg":{return "image/jpg";} break;
case ".css":{return "text/css";} break;
}
}
来源:CSDN
作者:菜鸟karroy
链接:https://blog.csdn.net/qq_39165556/article/details/88120638