最好的nodejs教程,node.js使用
大家好,今天小编来为大家解答以下的问题,关于最好的nodejs教程,node.js使用这个很多人还不知道,现在让我们一起来看看吧!
NodeJs全栈创建多文件断点续传
文章涉及的源代码在GitHub上,查看源代码。
项目安装这是一个Node项目,可以使用常规的方式进行设置,如果已经有一个项目,则可以继续执行该项目,完全没有问题。如果是全新开始,请执行以下操作:
下载并安装Node,它会全局上安装npm;
安装Yeoman,npminstall-gyo,并全局安装脚手架npminstall-ggenerator-norm;
创建项目文件所在的文件夹;
打开终端并使用cd命令导航到项目目录,例如cdmultifile-uploader;
运行命令npminit-y初始化npm项目,生成简单的package.json;
运行命令yonorm初始化项目基础依赖;
使用npminstallexpress--save命令安装express模块。
运行yarnstart,即可打开预览
工作原理现在来了解这个系统是如何工作的,此应用程序有2个流程需要服务器和客户端之间的严格协调。
上传流程:获取新文件,发送有关文件信息到服务器,服务器返回一个密钥(id),在发送文件块时需要使用该密钥(id),允许它跟踪文件并能够在以后发生中断时恢复它上传。
恢复上传流程:向服务器查询提供的名称和密钥(id)的文件的状态,以便服务器可以响应上传停止的块大小,以便上传可以从该点继续。
还有第四个端点,用于获取所有待处理的文件密钥以恢复上传,以防上传停止并且想在几天后恢复。对于本教程,一旦上传并获取ID,会将其保留在客户端以恢复它们,但是如果关闭浏览器选项卡,ID将丢失,并且将无法恢复。
客户端这里的客户端主要是WEB应用端。这个项目的HTML非常简单,修改文件app/index.html,下面是核心的代码。
<divclass="rowmarketing"><divclass="col-lg-12"><labelclass="upload-btn">上传文件<inputtype="file"multipleaccept="video/*"id="file-upload-input"style="display:none"/></label></div></div>这里的重要细节是input属性必须具有multiple属性以允许用户选择多个文件,还可以选择使用accept属性标识允许上传的文件类型。
对于上传文件,通过input的id属性获取元素对象,并为其绑定事件change来监听用户文件的选择。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});下面代码定义了uploadFiles方法:
constuploadFiles=(()=>{constURL=``;constENDPOINTS={UPLOAD:`${URL}upload`,UPLOAD_STATUS:`${URL}/upload-status`,UPLOAD_REQUEST:`${URL}/upload-request`,};constdefaultOptions={url:ENDPOINTS.UPLOAD,startingByte:0,fileId:"",onAbort(){},onProgress(){},onError(){},onComplete(){},};return(files,options=defaultOptions)=>{//handlefileobjectshere};})();上面的代码返回一个函数,它接受一个文件列表和一个可选的选项对象来处理上传。涉及的三个API端点如下:
upload:传输文件块
upload-status:查询文件上传状态,如果开始上传和停止或有什么东西中断了,迫使选择一个文件再次上传,这将返回关于文件停止的位置、在中断之前上传了多少块的信息。
upload-request:通知服务器要上传的内容,以便服务器设置密钥并在上传开始时跟踪文件。
选项对上传的各个阶段或状态进行回调(中止、进度、错误和完成),起始字节是从要发起上传的文件流的哪个位置开始,文件id是标识文件的一种方法。
文件上传UI/UX处理在服务器上设置上传端点之前,最好在客户机上处理它,因为这将帮助服务器端更有意义。
对于这一部分,需要一些处理UI的东西。这部分可以很容易地用任何UI库或框架来完成,比如Vue和Angular。
类似于uploadFiles函数,需要与uploadFiles交互并更新UI的uploadAndTrackFiles。uploadAndTrackFiles是一个函数,它获取一个文件列表并调用uploadFiles,然后通过将页面体上的每个文件元素进度指示器附加到progressBox容器中来设置视图。
在内部,它还有所有的回调函数来跟踪和响应每个文件状态。
constuploadAndTrackFiles=(()=>{constprogressBox=document.createElement("div");letuploader=null;constsetFileElement=(file)=>{//createfileelementhere};constonProgress=(e,file)=>{};constonError=(e,file)=>{};constonAbort=(e,file)=>{};constonComplete=(e,file)=>{};return(uploadedFiles)=>{[...uploadedFiles].forEach(setFileElement);document.body.appendChild(progressBox);uploader=uploadFiles(uploadedFiles,{onProgress,onError,onAbort,onComplete,});};})();从change事件侦听器中调用uploadAndTrackFiles传递文件列表。
elemFileInput.addEventListener("change",(e)=>{uploadAndTrackFiles(e.currentTarget.files);e.currentTarget.value="";});现在要做的一件事是清除之后的input的值,这样浏览器就就不会阻止用户添加更多的文件。到目前为止,可以回到uploadFiles函数中处理上传。
文件上传逻辑回到uploadFiles函数,循环遍历文件列表,并调用处理请求初始化的uploadFile。发起请求后,将返回一个对象,返回的对象为公开函数,当使用文件调用该函数集。
constuploadFiles=(()=>{constURL=``;constENDPOINTS={UPLOAD:`${URL}upload`,UPLOAD_STATUS:`${URL}/upload-status`,UPLOAD_REQUEST:`${URL}/upload-request`,};constdefaultOptions={url:ENDPOINTS.UPLOAD,startingByte:0,fileId:"",onAbort(){},onProgress(){},onError(){},onComplete(){},};constfileRequests=newWeakMap();constuploadFile=(file,options)=>{};constabortFileUpload=(file)=>{};constretryFileUpload=(file)=>{};constclearFileUpload=(file)=>{};constresumeFileUpload=(file)=>{};return(files,options=defaultOptions)=>{[...files].forEach((file)=>{uploadFile(file,{...defaultOptions,...options});});return{abortFileUpload,retryFileUpload,clearFileUpload,resumeFileUpload,};};})();因为可以同时上传多个文件,将定义WeakMap(与Map相比,键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收)类型的变量fileRequests来跟踪所有文件。
uploadFile函数只是让服务器知道它应该期待一个文件很快被上传,并提供文件名。
constuploadFiles=(()=>{constURL=``;constENDPOINTS={UPLOAD:`${URL}upload`,UPLOAD_STATUS:`${URL}/upload-status`,UPLOAD_REQUEST:`${URL}/upload-request`,};constdefaultOptions={url:ENDPOINTS.UPLOAD,startingByte:0,fileId:"",onAbort(){},onProgress(){},onError(){},onComplete(){},};constfileRequests=newWeakMap();constuploadFile=(file,options)=>{};constabortFileUpload=(file)=>{};constretryFileUpload=(file)=>{};constclearFileUpload=(file)=>{};constresumeFileUpload=(file)=>{};constuploadFileChunks=(file,options)=>{};constuploadFile=(file,options)=>{returnfetch(ENDPOINTS.UPLOAD_REQUEST,{method:"POST",headers:{"Content-Type":"application/json",},body:JSON.stringify({fileName:file.name,}),}).then((res)=>res.json()).then((res)=>{options={...options,...res};fileRequests.set(file,{request:null,options});uploadFileChunks(file,options);}).catch((e)=>{options.onError({...e,file});});};return(files,options=defaultOptions)=>{[...files].forEach((file)=>{uploadFile(file,{...defaultOptions,...options});});return{abortFileUpload,retryFileUpload,clearFileUpload,resumeFileUpload,};};})();一旦服务器用文件id进行响应,它就会更新函数,并使用请求选项创建一个文件请求空记录,以备后续重试。一旦这些都设置好了,它就会调用带有文件和更新选项的uploadFileChunks,这些选项将实际处理上传。
在这里,首先初始化表单数据和请求,然后从起始字节点开始对文件进行切片。
文件是一个Blob类型,它让用TypedArray来切片文件字节,这就是如何跟踪从哪一点开始上传文件服务器会负责把文件一块一块地放在一起。
constuploadFileChunks=(file,options)=>{constformData=newFormData();constreq=newXMLHttpRequest();constchunk=file.slice(options.startingByte);formData.append("chunk",chunk,file.name);formData.append("fileId",options.fileId);req.open("POST",options.url,true);req.setRequestHeader("Content-Range",`bytes=${options.startingByte}-${options.startingByte+chunk.size}/${file.size}`);req.setRequestHeader("X-File-Id",options.fileId);req.onload=(e)=>{//当请求状态不是200时被调用//这将只把200视为成功,其他的都是失败if(req.status===200){options.onComplete(e,file);}else{options.onError(e,file);}};req.upload.onprogress=(e)=>{constloaded=options.startingByte+e.loaded;options.onProgress({...e,loaded,total:file.size,percentage:(loaded*100)/file.size,},file);};req.ontimeout=(e)=>options.onError(e,file);req.onabort=(e)=>options.onAbort(e,file);req.onerror=(e)=>options.onError(e,file);fileRequests.get(file).request=req;req.send(formData);};然后,通过提供块的名称(即文件名)和文件id与服务器通信,并通过在将要发送的表单数据中设置这些属性。
当使用XMLHttpRequest时,需要打开一个请求,在这里发起一个POST请求,设置一些头信息。
Content-Range:这是与服务器通信的方式发送的文件字节的范围。该信息对服务器很重要,以便知道如何将文件放回一起并验证请求。
X-File-Id:传递文件id的另一种方式。
一旦设置好请求,就用传递事件和文件Blob的选项回调来映射上传进度事件。
一旦上传完成,就会触发load事件。
当请求接收到更多数据时,就会触发progress事件,从那里可以提取到目前为止上传的总字节数,并计算上传进度百分比。
timeout和error将被视为失败;
当触发中止以暂停上传时,中止将被触发。
接下来要做的就是使用WeakMap中的实际请求更新文件请求并发送表单数据。
文件恢复上传逻辑恢复上传的逻辑要简单得多,这里,所要做的就是使用提供的文件从WeakMap中获取文件请求,并将文件id和名称作为查询参数传递到服务器上查询该文件的上传状态。
有了状态(之前上传的总字节)后,调用uploadFileChunks函数,提供开始上传的字节。
constresumeFileUpload=(file)=>{constfileReq=fileRequests.get(file);if(fileReq){returnfetch(`${ENDPOINTS.UPLOAD_STATUS}?fileName=${file.name}&fileId=${fileReq.options.fileId}`).then((res)=>res.json()).then((res)=>{uploadFileChunks(file,{...fileReq.options,startingByte:Number(res.totalChunkUploaded),});}).catch((e)=>{fileReq.options.onError({...e,file});});}};文件重试上传逻辑文件上传过程中可能会出错,也许网络失去了连接,服务器崩溃了等等。
其逻辑与恢复上传逻辑几乎相同,唯一的区别是在catch块上,重新启动上传,以防文件从未开始上传,并且服务器不知道它。
constretryFileUpload=(file)=>{constfileReq=fileRequests.get(file);if(fileReq){//trytogetthestatusjustincaseitfailedmiduploadreturnfetch(`${ENDPOINTS.UPLOAD_STATUS}?fileName=${file.name}&fileId=${fileReq.options.fileId}`).then((res)=>res.json()).then((res)=>{//ifuploadedwecontinueuploadFileChunks(file,{...fileReq.options,startingByte:Number(res.totalChunkUploaded),});}).catch(()=>{//ifneveruploadedwestartuploadFileChunks(file,fileReq.options);});}};文件暂停上传逻辑要暂停当前上传的文件,需要中止请求。除了抓取文件上传进度,中止请求的能力是使用XMLHttpRequest的第二个原因。
当使用文件调用这个函数时,从WeakMap中获取请求,并使用请求调用abort函数来停止上传。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});0这将简单地停止向服务器发送块,然后可以通过调用resumeFileUpload函数继续上传。
文件清除逻辑在上传完成时或之后清除或取消上传,它只会中止请求并清除它,执行清除操作后将无法继续恢复上传。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});1上传进度在uploadAndTrackFiles函数,可以定义进度框的内部HTML,它将显示当前有多少文件正在上传,并提供一个上传进度恢复表,告诉有多少文件失败了、成功了、暂停了等等。
还有一个最大化按钮,当点击将展开或折叠上传程序。紧接着,有一个总的文件上传进度条和一个容器,将放置每个文件指示元素和单独的状态和控件。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});2一旦接收到文件Blobs,就可以使用它来创建文件元素,方法是调用setFileElement,它创建一个包含文件名、进度条、百分比以及用于处理文件上传的控制按钮的div。
还需要跟踪各个文件元素,以便稍后可以使用文件Blob引用它们。需要跟踪它的大小、状态、百分比和上传的块大小。所有这些细节将用于呈现元素进度细节并相应地更新视图。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});3一旦使用了这些元素,就获取了它的控制按钮的引用,并附加了从上传器调用公开方法的单击事件,以控制传递文件的内容。
当清除元素时,需要通过调用updateProgressBox函数来更新进度框元素。这是更新所有上传文件的整体细节的函数。比如所有失败、成功、暂停和上传文件。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});4还需要根据文件上传进度事件更新各个文件元素,它只是更新进度条百分比和状态文本消息,并根据文件上传状态切换可见或不可见的按钮。
constelemFileInput=document.getElementById("file-upload-input");elemFileInput.addEventListener("change",(e)=>{//handlefilehere});5现在有了基于上传事件更新元素的函数,需要相应地处理所有文件上传事件。
因此,每当进程事件调用onProgress回调函数时,将使用该文件从setFileElement函数中设置的文件中获取渲染的文件对象,并使用事件细节更新其状态、百分比和块大小,然后调用updateFileElement函数。
constelemFileInput=document.getElementById
node.js相比SpringMVC有什么优势
node.js相比SpringMVC有什么优势优势:
基于javascript是其最大优势。这给nodejs提供了大量的潜在使用者。
nodejs易学。如果懂web开发的大部分知识,只要跟着教程和使用合适的框架,可以很快开发出简单的web app。
nodejs基于事件系统,面向web开发而开发。在io效能上有优势(其实是强制非同步程式设计)。
nodejs热度很高,社群(开源)非常活跃。(跟1相关但是不是直接关系)
就是你说的,程式码密度高。简短的程式码可以完成开发任务。
(源自4)各种库和框架多、新、质量好。连线资料库的库什么的。
Node.js优点:
1、采用事件驱动、非同步程式设计,为网路服务而设计。其实Javascript的匿名函式和闭包特性非常适合事件驱动、非同步程式设计。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。
2、Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高效能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。3、Node.js轻量高效,可以认为是资料密集型分散式部署环境下的实时应用系统的完美解决方案。Node非常适合如下情况:在响应客户端之前,您预计可能有很高的流量,但所需的伺服器端逻辑和处理不一定很多。
Node.js缺点:
1、可靠性低
2、单程序,单执行绪,只支援单核CPU,不能充分的利用多核CPU伺服器。一旦这个程序崩掉,那么整个web服务就崩掉了。
.相比,Node.js有什么优势?一个规模稍微大点的系统都不是一种开发语言可以搞定的,往往是几种混杂一起,比如c、c++做伺服器端开发,java做业务逻辑,php等做前端展示,此外还需要讯息中介软体等等。
nodejs可以很快地在伺服器端做原型(原来只有c系和java等能做的事情,效能还很高),而且程式码量相对会少很多;另一点是它的语法优势,js闭包等。但它不太适合做cpu密集型处理的工作,只能绕着弯去解决,据说这次QCon会有人分享这方面的研究成果,可以关注下。
每种语言都有它适合的领域,没必要强求一门语言可以解决所有事情,拥有其它语言的特性,只有不断的tradeoff把系统做出来才是目标。
在技术层面上,和Erlang/OTP相比,Node.js有什么优势 Node最大的好处,其实不是技术层面的,我认为就是一点:能让前端开发人员把后端也一起做了.别小看这一点,这对于很多Startup的专案还是很有用的,可以快速人少的就把专案做起来.
至于它里面提到的技术,什么事件驱动,回拨之类的,在一个多年做伺服器的人看来根本不算啥,老早就是这么做的了,看看lighty/nginx之类的,不知道为啥把这个做为宣传点,是欺负前端人员没啥伺服器开发经验么?
Erlang没有用过,不过从底层上来看,主要着力点还是处理IO上,虽然从语法层次上看不出有大语种执行绪的痕迹,但是底层在IO处理上还是用的那些epoll那些非同步io技术。
但是Erlang这门语言太复杂了,相信选择这么语言的人会很少。
web前端学习教程流程有什么
Web前端不仅薪资bai比较高,而且发展前景也很可du观,越来越多的年轻人纷纷选zhi择web前端作为未dao来的职业发展方向,但是就怎么选择学习方法而言,但是很多都是零基础来学习web前端的,对于这个行业可能一概不知,该怎么去学习呢?什么样的学习方法更适合学。,那么这份最详细的web前端学习路线分享给大家。
第一阶段:前端页面重构
内容包含了:(PC端网站布局项目、HTML+CSS基础项目、WebApp页面布局项目)
第二阶段:JavaScript高级程序设计
内容包含:)原生 JavaScript交互功能开发项目、面向对象进阶与 ES/ES应用项目、JavaScript工具库自主研发项目)
第三阶段:PC端全栈项目开发
内容包含:(jQuery经典交互特效开发、HTTP协议、Ajax进阶与PHP/JAVA开发项目、前端工程化与模块化应用项目、PC端网站开发项目、PC端管理信息系统前端开发项目)
第四阶段:移动端项目开发
内容包含:(Touch端项目、微信场景项目、应用 Angular+Ionic开发 WebApp项目、应用 Vue.js开发 WebApp项目、应用 React.js开发 WebApp项目)
第五阶段:混合(Hybrid,ReactNative)开发
内容包含:(微信小程序开发、React Native、各类混合应用开发)
第六阶段:NodeJS全栈开发
内容包括:(WebApp后端系统开发、一、NodeJS基础与NodeJS核心模块二、Express三、noSQL数据库)
第七阶段:大数据可视化
内容包含:(大数据可视化化基础与实战、一、数据可视化入门、二、D.js详解、三、其他JS库)
对于想学习web前端的同学来说:首先是自学,其实自学也不是不可以,只要有毅力能坚持,自己学习是完全没有问题的,现在有很多同学也是自己找资料视频来学习。最后技术也学的挺牛的,得看个人兴趣和悟性,软件开发本来就是一项比较枯燥的工作,如果只是单纯的觉得这项行业工资高而进来的话,可能学习中遇到技术难题,就会知难而退了,难以坚持下去,而真正爱这行的会迎难而上,不解决不罢休,这也是为什么有些能自学下来有些却不行的原因。
如果选择培训机构的话,对于没有基础或者毅力坚持下去的同学是比较好的学习方式,首先培训机构课程比较完善,没有基础的同学往往不知道从哪个方向去学习,而培训机构能更好的满足这部分学员,一般培训机构的老师都是经验比较丰富的,讲课的时候重点和难点会详细讲解,及时解决,这样学习的能保障每个学员都能弄懂,而且不用自己苦思冥想找答案。这样也大大的提升了学习的热情。最重要的是培训机构有阶段性的项目练习,这个对于自学的同学来说是没有的,现在的企业都是看着每个求职者的动手能力,如果有项目的实践操作,在应聘中也更有竞争力。
其实不管自学还是培训机构也好,最重要的是看自己的热情,还有能不能吃苦和努力,web前端开发确实是高薪职业,市场需求也很大,只要你有本事,你就是企业需求的人才,那么想快速达到这个技术能力,自己该怎么做怎么学就看你自己的选择了。
文章分享结束,最好的nodejs教程和node.js使用的答案你都知道了吗?欢迎再次光临本站哦!