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

node.js学习笔记

时间:2023-04-03 23:06:34 Node.js

最近一直在学习node.js,所以总结了一些笔记记录在这里。modulesmodulesmodulesandscopenodeffferFileHttpstreammodularizationandscopethis在浏览器中this指的是globalthis在windownode脚本文件中没有定义时指向global,定义时module.exportsa=10console。log(global.a)//10全局作用域没用。用varletconst定义的声明都是全局作用域。模块范围用变量修饰。它们都是模块作用域。Functionscopesblock-levelscopesBufferhandlesbinarydata//数组拼接缓冲区rs=require('fs').createReadStream('test.txt',{highWaterMark:10})vardata=[]rs.on('data',function(chunk){data.push(chunk)})rs.on('end',function(chunk){varbuf=Buffer.concat(data)console.log(buf.toString())})FileSystemreadFile用于异步读取文本文件的内容,会将一个文件的所有内容读入内存,适用于小文本文件;读取大文件,使用stream,readFileSync直接返回文本数据内容readFile第一个参数为文件名,如果没有自动返回create。fs.stat获取文件的状态通常开发者可以在调用open()read()或write方法之前调用fs.stat方法来判断文件是否存在。fs.stat和fs.fstat的作用是一样的,区别在于fstat方法的第一个参数是文件描述符,格式为整型,fstat方法通常和open方法一起使用,因为结果open方法返回的是一个文件描述。varfs=require('fs')vardata=fs.readFileSync('test.txt',{encoding:'utf-8'})console.log(data)fs.writeFile('foo.txt',"你好world",{flag:'a',encoding:'utf-8'},function(err){if(err){console.log(err)return}console.log('success')})fs.stat//用于获取文件状态,判断文件是否存在//经常在调用openreadwiter时,调用fs.stat("foo.txt",function(err,result){if(err){console.log(err)return}console.log(result)})//fs.fstatfs.open("foo.txt",'a',function(err,fd){if(err){console.log(err);返回;}console.log(fd);fs.fstat(fd,function(err,result){if(err){console.log(err);return;}console.log(result);})})//示例//获取目录中的文件名。//fs.readdir和fs.stat两个apivarsfs=require("fs");functiongetAllFileFromPath(path){fs.readdir(path,function(err,res){for(varsubPathofres){varstatObj=fs.statSync(path+"/"+subPath);//这里使用了同步的方式,而不是异步的if(statObj.isDirectory()){//判断是否是文件夹console.log("Dir:",subPath);getAllFileFromPath(path+"/"+subPath)//如果是文件夹,则递归获取子文件夹中的文件列表}else{console.log("File:",subPath);}}})}getAllFileFromPath(__dirname);httpvarhttp=require('http')varserver=http.createServer(function(req,res){//处理http请求varmethod=req.methodvarurl=req.urlconsole.log(method,url)res.writeHead(200,{'content-type':'text/plain'})res.end('hellonode!')})//监听来自客户端的事件server.on('connection',function(req,res){console.log('connection')})server.on('request',function(req,res){console.log('request')})server.listen(8080)//访问8080时,控制台进入//已连接//请求//请求被打印两次,因为其中一次是对favicon.ico的请求//一个简单的静态服务器varhttp=require('http')varfs=require('fs')varserver=http.createServer(function(req,res){if(req.url=='/'){//access8080varfileList=fs.readdirSync('./')res.writeHead(200,{'content-type':'text/plain'})//将数组转换为字符串并返回res.end(fileList.toString())}else{varpath=req.url;//在路径字符串前加上.表示当前目录,避免在nix系统中访问/folderfs.readFile('.'+path,function(err,data){if(err){res.end('doesnotexist')throwerr;}res.writeHead(200,{'content-type':'text/plain'})res.end(data)})}})//1buffer.js,2http.js,3httpexmple.js,4.js,foo.txt,login.html,md.md,readFile.js,test.txt,this.js,upload.jsserver.listen(8080)//处理异常process.on('uncaughtException',function(){console.log('goterror')})processhttprequestmethodurlheadergetpostputdeleteupdate//处理http请求varmethod=req.methodvarurl=req.urlResponseobjectuploaddataupload.html<formaction="/upload"method="post"enctype="multipart/form-data">
js//npm安装依赖强大的varhttp=require('http')varfs=require('fs')varformidable=require("formidable");varserver=http.createServer(function(req,res){if(req.url=='/upload'){switch(req.method){case'GET':fs.createReadStream('upload.html').pipe(res)breakcase'POST':dealpost(req,res)//自定义方法处理breakdefault:console.log('otherrequest')}}else{res.writeHead(302,{'Location':'./upload'})res.end()//将所有的url访问都转到/login路径}})functiondealpost(req,res){varform=新的强大的.IncomingForm();form.keepExtensions=trueform.uploadDir=__dirnameform.parse(req,function(err,fields,files){if(err){throwerr}console.log(fields)console.log(files)res.writeHead(200,{'content-type':'text/plain'})res.end('上传完成')})}server.listen(8080)streamstream模块是节点运行丢失数据的四种基本流类型。readablereadablestreamwritablewritablestreamduplex是一种可读可写的流,将写入的数据进行转换,然后读取结果,通常用于数据和输出数据不需要匹配的场景,varstream=require('stream')varfs=require('fs')varreadStream=fs.createReadStream("./text.txt",'utf-8')readStream.on('data',function(data){console.log(data)})readStream.on('close',function(){console.log('close')})readStream.on('error',function(){console.log('error')})当创建一个可读流来读取一个大文件,调用pipe方法通过可写流将数据写到另一个位置,如果读取速度大于写入速度,那么node会将数据缓存在内存中。pipe方法相当于可读流和可写流之间的桥梁。是的,数据可以通过管道从可读流传递到可写流。使用管道重写静态文件服务器varstream=require('stream')varhttp=require('http')varfs=require('fs')varserver=http.createServer(function(req,res){if(req.url=='/'){varfileList=fs.readdirSync('./')res.writeHead(200,{'Content-type':'text/plain'})res.end(fileList.toString())}else{try{varreadStream=fs.createReadStream(path).pipe(res);}catch(e){res.end("文件不存在");}}})server.listen(3000)console.log("Listeningon3000");//处理异常过程。on("uncaughtException",function(){console.log("goterror");})//pipe方法接收一个可写对象,当可读对象调用pipe方法时,会在内部调用该对象的write方法要写入的可写对象。Events事件和监听器eventsnode程序中的对象会产生一系列的事件,这些事件称为事件触发器,所有能够触发事件的对象都是eventEmitter类的实例。eventEmitter定义了on方法。vareventEmitter=require("events");varmyEmitter=neweventEmitter();myEmitter.on("begin",function(){console.log("begin");})myEmitter.emit("begin");Chapter5middleware中间件1中间件的概念快递本身是由路由和中间件组成。本质上,express的运行就是不断调用这个中间件。中间件本质上是一个接收请求并采取相应动作的功能。该函数通常接收req和res作为参数,对请求和响应对象进行操作。在Web应用中,客户端发起的每一个请求都必须先经过中间件的处理,才能继续向下。中间件的第三个参数一般写成next,代表一个方法,即next中间件。如果我们在中间件的方法体中调用了next方法,就意味着这个请求会被next中间件处理。2中间件的功能中间件是一个可以做任何节点代码可以做的功能,除了修改请求和响应对象,结束请求-响应循环,调用下一个中间件等。通常通过调用下一个来实现方法内部。如果某个中间件中没有调用next方法,则说明请求的处理到此结束,不会执行下一个中间件。中间件的加载中间件的加载是通过use方法实现的,use方法定义在express或koa对象的实例上。varapp=express()app.use(md)express中的中间件express应用可以使用以下几种中间件应用级中间件路由级中间件错误处理中间件内置中间件第三方中间件应用级中间件使用app.use方法,app对象绑定的中间件路由级中间件路由处理是express的一部分,koa是通过第三方的koa-router