当前位置: 首页 > 后端技术 > Node.js

Node的web开发

时间:2023-04-03 19:32:15 Node.js

使用Node进行网络开发用户在浏览器中输入网址-->获取网页的过程经历了几个步骤:通过浏览器向服务器发送请求(在浏览器中经历的DNS解析期间,TCP3握手连接)服务器分析处理用户的请求,并产生请求的内容,然后发送给浏览器。相应地处理内容并将响应返回给客户端。Node可以使用http模块来构建Web服务器。http模块http模块不是Node的核心模块。它需要使用require()加载。使用http.createServer()方法创建一个http服务器并返回一个http服务器对象。使用服务器对象进行开发。接收到的回调函数是监听客户端请求。回调函数server.listen()方法可以启动Web服务,监听某个主机的某个端口的参数为(port,hostname,backlog,callback)port为监听主机的端口号;hostname是监听主机的IP地址;callback是服务器开启成功后的回调函数(服务器开启后,再连接数据库)//搭建一个HTTP服务器,处理用户发送的http请求//http模块不是核心模块,require()importvarhttp=require('http');//http模块的createServer()方法可以返回一个标准的http服务器对象//通过服务器对象开发//callback是监听客户端连接的回调函数varserver=http.createServer(回调);//服务器监听某个网卡的某个端口,并启动服务//listen(port,hostname,backlog,callback)//port为监听端口,hostname为监听主机的IP地址,和callback是服务器启动成功后的消息Callbackfunction//服务器启动失败时触发error事件server.on('error',function(err){console.log(err);})//服务器启动成功时触发监听事件server.on('listening',function(){console.log('listening...8080');})//监听来自客户端的请求事件,并触发服务器.on('request',function(){console.log当收到请求时(“有请求”);})server.listen(8080,'localhost');主事件服务器启动失败事件错误的监听:server.on('errro',function(err){})监听服务器启动成功的事件监听:server.on('listening',function(err){}),可以写在server.listen()方法的回调函数中。监听服务器收到请求的事件请求:server.on('request',function(err,req,res){}),可以写在http.createServer()方法的回调函数中。参数对象request事件接收两个参数:request对象:提供客户端请求相关数据该对象是http.IncomingMessage类的一个实例,具有相应的属性和方法。httpVersion属性:使用的HTTP协议的版本。header属性:请求头中的相关数据。url属性:method属性:request的方法...response对象:服务器发送给客户端的响应数据对象是http.ServerResponse类的实例write(chunk,[encoding]):发送数据库到response的文本(网页的内容数据),发送完后调用res.end()方法方法,res.end()需要告诉服务器所有数据已经??发送完毕,每次响应都必须调用res.end()方法,并在最后调用。如果指定了chunk,则相当于在调用response.write(chunk,encoding)后调用response.end(callback)writeHeader(statusCode[,statusMessage][,headers]):写入头信息,在res.write()中调用之前,并且在一个响应中只能调用一次,header信息写在一个对象的statusCode属性中,可以结合setHeader()方法实现writeHeader()的功能server.on('request',function(req,res){console.log("thereisarequest");varchunk='

helloworld

';//Buffer.byteLength(chunk)以字节为单位,告诉浏览器解析返回的数据纯文本res.writeHeader(200,'OK',{'Content-type':'text/plain','Content-length':Buffer.byteLength(chunk)});res.end(chunk,'utf-8');})url处理根据用户请求的路径返回不同的数据,可以使用req.url获取路径信息。之后的部分?在req.url中称为查询。Node下的url模块可以对request中的req.url进行处理,使用switch结构对不同的路径名划分不同的逻辑处理方式server.on('request',function(req,res){console.log(req.url);//req.url获取请求的路径信息varurlStr=url.parse(req.url);switch(urlStr.pathname){case'/'://前端页面res.writeHeader(200,'OK',{'Content-type':'text/plain'});res.end('

Homepage

','utf-8');break;case'/users'://用户页面res.writeHeader(200,'OK',{'Content-type':'text/plain'});res.end('

UserPage

','utf-8');break;default://不存在res.writeHeader(404,'NotFound',{'Content-type':'text/plain'});res.end('

Error

','utf-8');break;}})使用fs模块分离行为和性能根据用户访问的不同路径,执行不同的操作,读取不同的页面server.on('request',function(req,res){console.log(req.url);varurlStr=url.parse(req.url);switch(urlStr.pathname){case'/'://主页sendData(htmlDir+'/index.html',req,res);//请求不同的路径,读取不同的页面返回给客户端break;case'/users'://用户页面sendData(htmlDir+'/user.html',req,res);休息;default://不存在sendData(htmlDir+'/404.html',req,res);休息;}});//每次请求读取一个静态页面,然后输出fs.readFile()方法封装新增fs.open()、fs.read()和fs.close()方法//fs的返回值。readFile()是原始缓冲区对象functionsendData(file,req,res){fs.readFile(file,function(err,data){if(err){res.writeHeader(404,"NotFound",{'Content-Type':'text/html'});res.end('NotFound');}else{res.writeHeader(200,"OK",{'Content-Type':'text/html'});res.end(data);}});}处理通过GET方法传递的GET和POST请求提交的数据可以使用url.parse(req.url).query获取数据提交的数据GET请求,使用querystring内置模块(无需加载)解析GET请求提交的数据。在url中绑定,使用querystring.parse()方法解析url的query属性即可获取GET请求提交的数据。POST请求提交的数据在HTTP的正文中。服务端收到的是数据流(因为POST请求提交的数据量大,需要从缓冲区中读取chunk)使用请求对象的data事件触发回调函数接收所有提交的数据.可以拼接成字符串接收到所有数据后触发end事件,然后可以使用querystring.parse()解析所有接收到的数据varhttp=require('http');varurl=require('url');varfs=require('fs');varquerystring=require('querystring');varserver=http.createServer();varhtmlDir=__dirname+'/html/';//使用fs读取html目录下的文件server.on('request',function(req,res){varurlStr=url.parse(req.url);switch(urlStr.pathname){case'/'://首页sendData(htmlDir+'/index.html',req,res);break;case'/users'://用户页面sendData(htmlDir+'/user.html',req,res);break;//添加路由到登录页面case'/login'://用户页面sendData(htmlDir+'/login.html',req,res);break;//增加对登录页面提交数据的处理case'/login/check'://用户页面if(req.method.toUpperCase()==='GET'){console.log(querystring.parse(urlStr.query));//使用querystring.parse()解析将传递的数据放入对象}if(req.method.toUpperCase()==='POST'){varstr='';//用于接收来自POST的数据req.on('data',fun动作(块){str+=块;})req.on('end',function(){console.log(querystring.parse(str));})}break;default://不存在sendData(htmlDir+'/404.html',req,res);休息;}});//每次请求读取静态页面,然后输出封装了fs.open()、fs.read()和fs.close()方法的fs.readFile()方法functionsendData(file,req,res){fs.readFile(file,function(err,data){if(err){res.writeHeader(404,"NotFound",{'Content-Type':'text/html'});res.end('NotFound');}else{res.writeHeader(200,"OK",{'Content-Type':'text/html'});res.end(data);}});}server.listen(8080,'本地主机');常识http模块服务端返回的数据类型默认为text/html。http模块中的http.STATUS_CODES属性包含了所有的状态码及其描述信息