1.1请求参数
客户端向服务器端发送请求时,有时需要携带一些客户信息,客户信息需要通过请求参数的形式传递到服务器端,比如登陆操作。
1.2GET请求参数
- 参数被放置在浏览器地址栏中,例如:http://localhost:3000/?name=zhangsan&age=20
1.3POST请求参数
- 参数被放置在请求体中进行传输(也就是请求报文)
- 获取POST参数需要使用data事件和end事件
- 使用querystring系统模块将参数转换为对象格式
//导入系统模块querystring用于将HTTP参数转化为对象格式
const querystring=require('querystring');
app.on('request',(req,res)=>{
let postData='';
//监听参数传输事件
req.on('data',(chunk)=>postData+=chunk;);
//监听参数传输完毕事件
req.on('end',()=>{
console.log(querystring.parse(postData));
})
})
1.4静态资源
服务器端不需要处理,可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件。
1.5动态资源
相同的请求地址不同的响应资源,这种资源就是动态资源。
http://www.itcast.cn/article?id=1
http://www.itcast.cn/article?id=2
1.6路由
http://localhost:3000/index
http://localhost:3000/login
路由是指客户端请求地址与服务器端程序代码的对应关系。简单的说,就是请求什么响应什么。
//当客户端发来请求的时候
app.on('request',(req,res)=>{
//获取请求方式
const pathname=url.parse(req.url).pathname;
//获取客户端的请求路径
let{pathname}=url.parse(req.url);
res.writeHead(200,{
'content-type':'text/html;charset=utf8'
})
if(method=='get'){
if(pathname=='/'||pathname=='/index'){
res.end('欢迎来到首页');
}else if(pathname=='/list'){
res.end('欢迎来到列表页');
}else{
res.end('抱歉,您访问的页面出游了');
}
}else if(method=='post'){
}
})
1.7node.js异步编程
-
同步API,异步API
同步API:只有当前API执行完成后,才能继续执行下一个API
console.log('before'); console.log('after');
异步API:当前API的执行不会阻塞后续代码的执行
console.log('before'); setTimeout{()=>{ console.log('last'); },2000}; console.log('after'); //输出结果的顺序before after last
//路径拼接 const public path.join(__dirname,'public'); //请求地址解析 const urlObj=url.parse(req.url); //读取文件 fs.readFile('./demo.txt','utf8',(err,result)=>{ console.log(result); })
-
同步API,异步API的区别(获取返回值)
同步API可以从返回值中拿到API执行的结果,但异步API是不可以的
//同步 function sum(n1,n2){ return n1+n2; } const result=sum(10,20); console.log(result); //输出结果为10,20
//异步 function getMsg(){ setTimeout(function(){ return{msg:'Hello Node.js'} },2000); } const msg=getMsg(); //输出结果为undefined要想拿到结果要使用回调函数
-
回调函数
自己定义函数让别人去调用
//getData函数定义 function getData(callback){} //getData函数调用 getData(()=>{});//将一个箭头函数做为另一个函数的参数被调用
-
Promise
Promise出现的目的是解决Node.js异步编程中回调地狱的问题
let promise=new Promise((resolve,reject)=>{ setTimeout(()=>{ if(true){ resolve({name:'张三'}) }else{ reject('失败了') } },2000); }); promise.then(result=>console.log(result);//{name:'张三'}) .catch(error=>console.log(error);//失败了)
-
异步函数
异步函数是异步编程语法的终极解决方案。它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
const fn=async()=>{}; async function fn(){}; //1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数 //2.异步函数默认的返回值是promise对象 //3.在异步函数内部使用throw关键字进行错误的抛出 //await关键字 //1.它只能出现在异步函数中 //2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行 async function fn(){ throw '发生了一些错误'; return 123; } //console.log(fn()) fn().then(function(data){ console.log(data); }).catch(function(err){ console.log(err); })
-
大师傅但是