req、res的方法
1.获取请求参数post、get
const http = require('http');
const app = http.createServer();
app.on('require',(req,res) => {
const result = req.method;
res.end(result);
});
app.listen(3000);
console.log('服务器启动成功');
搭建服务器,在app绑定的require事件中,回调函数的返回参数req下的method方法可以返回当前发出请求api的请求方式。
2.获取请求地址
在浏览器通过输入不同的域名获得不同响应,服务器端如何获取请求地址呢?
const url = req.url;
console.log(url)
只要使用req.url就能使服务器获取请求地址。
3.响应报文设置
浏览器会根据响应报文的内容解析响应内容,所以设置响应报文一定程度影响了页面的展示。
const http = require('http');
const app = http.createServer();
app.on('require',(req,res) => {
res.writeHeader(200,{
'content-type':"text/html;charset=utf8"
});
});
app.listen(3000);
console.log('服务器启动成功');
首先浏览器会看报文的状态码(200-请求成功,404-没有找到页面,500-服务器错误,400-请求代码语法错误),我们可以自己设置状态码,使用res下的writeHeader(),其第一个参数是状态码,第二个传递对象,告诉浏览器传递过来的内容类型,浏览器也会据此解析。
参数处理
1.get参数处理
当客户端传递参数,比如登录时传递姓名密码,我们怎么获取传递过来的参数呢?我们知道使用get方法传参,参数会跟在请求地址后面,而在上文提到req.url可以获取请求地址,我们再对请求地址进行操作,但这样很麻烦,所以node提供了内置模块供我们处理参数。
const http = require('http');
const url = require('url');
const app = http.createServer();
app.on('require',(req,res) => {
const params = url.parse(req.url,true).query;
console.log(params.name);
console.log(params.name);
});
app.listen(3000);
console.log('服务器启动成功');
我们要用require引入url内置模块,url下有一个parse()方法,第一个参数为要处理的请求地址也就是req.url,此时它会将请求参数转为对象,但是客户端传递的参数仍为字符串,第二个参数true,便将参数转为对象形式名为query,query便是传递的参数的对象形式。
2.post参数处理
post和get不同,其传递的参数不会在请求地址后面,那我们怎么处理呢?
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const app = http.createServer();
app.on('require',(req,res) => {
let postParams = '';
req.on('data',params => {
postParams += params;
});
req.on('end',() => {
console.log(querystring.parse(postParams));
});
});
app.listen(3000);
console.log('服务器启动成功');
这里又要使用querystring内置模块,可以将字符串转为对象。首先浏览器在传参的时候不是全部传递,而是分批传递,所以我们给req绑定data和end事件,表示当传递数据是和传递数据结束时做的事情。传参结束后形成参数字符串形式,我们再使用querystring中的parse(),我们得到参数对象形式。
同步异步
1.promise解决回调地狱
由于异步API在调用的时候,前面执行的代码不会阻塞后面的代码,但是我们有时候后面代码的执行依赖前面代码的执行结果,我们使用回调可以实现,但是一层套一层,其代码维护性不高且复杂,于是promise诞生了,用于解决回调地狱问题。
const fs = require('fs');
const promise = new Promise((resolve,reject) => {
fs.readFile('./zxy.txt','utf8',(err,doc) => {
if (err!=null){
reject(err);
}else{
resolve(result);
}
});
});
promise.then((result) => {
console.log(result);
}).catch((err) => {
console.log(err);
});
原理是创建一个promise对象,它有resolve和reject两个函数对象,分别代表成功的信息和失败的信息,promise是希望将读取的数据拿到外面处理,调用promise的then和catch,then便代表成功时候,调用resolve函数,传递result接受参数。有几个文件对象我们就调用几个promise对象。
2.异步函数
进行封装,将异步代码写成同步形式,使代码不再有嵌套的形式,使代码结构更加清晰。
const fs = require('fs');
async function fn(){
throw '发生错误';
return zxy;
};
fn().then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
});
异步函数便是在普通函数前加async,此函数返回promise对象,所以结果显示仍然拿到外部用then和catch方法。除此之外,异步函数还有一个await,其功能是只有当前一个函数返回结果了才会执行后面的。
async function p1(){return 'p1'};
async function p2(){return 'p2'};
async function p3(){return 'p3'};
async function run(){
let r1=await p1();
let r2=await p2();
let r3=await p3();
console.log(r1);
console.log(r2);
console.log(r3);
};
但值得注意的是,await只能在异步函数中使用。