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

Node.js入门前你需要知道的10个问题

时间:2023-04-03 20:56:22 Node.js

本文将与大家分享《Node.js入门前你需要知道的10个问题》道,因此,新项目Nodejs-Interview-Questions有了最近开源了,重点分享Node.js面试题,提供中英文版本,也可以在线预览:https://interview.nodejs.red/Q1:WhatIsitNode.js?Node.js是一个基于ChromeV8引擎的JavaScript运行环境。它是一个开源和跨平台的服务器端应用程序。任何人都可以编写JavaScript代码来开发Node.js应用程序。它可以在MicrosoftWindows、Linux或OS系统上运行。Node.js不是一门新语言,也不仅仅是一个基于JavaScript的框架,它基于Chrome的JavaScript运行时,因此代码的编写和执行非常像浏览器。Node.js特性这里是Node.js的一些重要特性高度可扩展Node.js使用单线程模型并使用事件循环架构,使得编写高度可扩展的服务器变得简单和安全。一些传统的服务器端语言会创建多个线程来处理请求。通常,创建线程有系统资源开销,所以有一些限制。Node.js只创建一个线程来处理更多的请求。事件驱动和异步Node.js的所有API都是异步的。这意味着当下一个请求到来时,可以直接处理,而不用等待上一个请求的结果先返回。无缓冲Node.js从不缓冲任何数据,请参阅什么是Node.js的无缓冲特性我们中的许多人可能对Node.js感到困惑。它不是像Apache这样的Web服务器。Node.js提供了一种新的方式来执行我们的代码。它是JavaScript的运行时。Node.js提供了创建HTTP服务器的方法,我们可以在其上托管我们的应用程序。来源:Node.js简介Q2:如何安装Node.js?我们可以从Node.js官网https://nodejs.org/en/下载并安装该软件。nvm安装推荐使用nvm工具安装,方便后期升级管理Node.js版本。以下是安装步骤:安装nvm:wget-qO-https://raw.githubusercontent...|bash查看所有Node.js版本:nvmls-remote查看本地Node.js版本:nvmls安装Node.js:nvminstallv6.9.5设置系统默认Node.js版本:nvm别名defaultv6。9.5验证安装结果Node.js安装成功后,我们可以检查它是否正常工作。打开命令终端,输入以下命令$node,会出现Node提示符。我们编写如下命令,运行并查看console.log("helloworld!");回车Q3:如何使用Node.js监听80端口?这是一个陷阱,在一些类似Unix的系统上你不应该尝试监听80端口,这样做你需要有超级用户权限,所以不推荐这样做。但是,如果一定要让应用监听80端口,可以使用Nginx来实现,在应用前面加一层反向代理。还是建议大家监听大于1024的端口。Q4:什么是错误优先回调函数?错误优先级回调函数用于同时返回错误(error)和数据信息(data)。返回值第一个参数作为错误信息描述,校验是否有错误(非错误error为null),其他参数用于返回数据。fs.readFile(filePath,function(err,data){if(err){//错误信息处理returnconsole.log(err)}//返回数据对象returndata;})Q5:可以在创建Http服务?通过代码在Node.js中创建一个Http服务是非常简单的,我们可以通过HTTP模块来完成这些操作。consthttp=require('http');constserver=http.createServer((request,response)=>{if(request.url==='/hello'){response.writeHead(200,{'Content-Type':'text/plain',});response.end('helloworld!');}else{response.end('OK!');}});server.listen(3000,'127.0.0.1',()=>{console.log('serviceislisteningathttp://127.0.0.1:3000');});Q6:Node.js的核心组件是什么?Node.js的核心组件是系统API、V8引擎和Libuv。libuv库libuv库是一个跨平台支持事件驱动的I/O库。它是使用C和C++语言为Node.js开发的。但它也被用于Mozilla的Rust、Luvit、Julia、pyuv和其他语言中。libuv库是I/O操作的核心部分,例如读取文件和与操作系统交互。Libuv的学习可以参考来自谷歌的libuv中文教程V8引擎:《V8是谷歌开源的高性能JavaScript引擎》,用C++开发,用于谷歌浏览器。ECMA-262在ECMAScript中指定,在V8中实现,第三版运行在WindowsXP和Vista、MacOSX10.5和使用IA-32或ARM/MIPS处理器的Linux系统上。V8可以独立运行或嵌入到任何C++应用程序中。如果您有兴趣了解有关V8引擎的更多信息,请访问什么是V8?APIs(NodeJSCoreLibs)Node.jsAPIs就是根据你的要求调用一些函数来进行一些业务操作。默认情况下,Node.jsAPI是异步的,但如果需要,您可以同步使用它们(不推荐使用同步方法)。例如,fs模块可以同步或异步使用。varfs=require('fs');fs.readFile('/files/help.txt',function(err,buf){//使用fs.readFileSync()进行同步操作。console.log(buf.toString());});资料来源:NodeJS简介,ASSJS:第一部分-组件解释Q7:什么是“回调地狱”以及如何避免它?“回调地狱”是指严重的回调嵌套,导致代码难以阅读和维护。下面是一个回调嵌套的例子:query("SELECTclientIdFROMclientsWHEREclientName='picanteverde';",function(id){query(`SELECT*FROMtransactionsWHEREclientId=${id}`,function(transactions){transactions.each((transac)=>{query(`UPDATEtransactionsSETvalue=${transac.value*0.1}WHEREid=${transac.id}`,(error)=>{if(!error){控制台.log("成功!!");}else{console.log("error");}});});});});在某种程度上,解决“回调地狱”的方法是更改??模块。回调被分解成可以作为参数传递的单个函数。因此,对上述代码的第一个改进如下所示:constlogError=(error)=>{if(!error){console.log("success!!");}else{console.log("error");}},updateTransaction=(t)=>{query(`UPDATEtransactionsSETvalue=${t.value*0.1}WHEREid=${t.id}`,logError);},handleTransactions=(transactions)=>{transactions.each(updateTransaction);},handleClient=(id)=>{query(`SELECT*FROMtransactionsWHEREclientId=${id}`,handleTransactions);};query("SELECTclientIdFROMclientsWHEREclientName='picanteverde';",handleClient);虽然这段代码比第一个例子更容易阅读,而且我们创建的函数可以重用。但有些情况下,我们希望让程序更加健壮,可以通过Promise来解决。此外,生成器还提供了强大的回调地狱解决方案,可以用来解决不同回调之间的依赖关系。但是,生成器更先进,使用起来也更复杂。关于Generators的更多信息,可以阅读这篇文章Node.js中的Generators不过,虽然上面可以解决回调地狱的问题,但是目前有更好的解决方案Async/Await。使用Async/Await时需要注意Node.js版本在v7.5以上。来源:8个基本的Node.js面试问题Q8:什么是Node.js中的事件驱动编程?事件驱动程序是由事件(点击、加载等)决定的代码流的术语。它是当今流行的编程语言(如C#、Java)中最基本的里程碑之一,这里不再详述。在Node.js或其他一些JavaScript项目中,我们都使用事件驱动编程。也许你不知道事件驱动编程,但在一些页面加载或按钮点击事件中,你已经用过了。作为一个典型的事件驱动流程的例子,看看它在Node.js中是如何完成的:result=getJSONfromDestination();绑定数据(结果);上面的操作是一个阻塞I/O(单线程模式会等待,直到阻塞I/O完成才会进行下一步)下面我们看看异步如何进行(非阻塞I/O过程)json_finished=function(结果){绑定数据(结果);}getJSONfromDestination(jsonfinished);如上所示,这是一个非阻塞的例子,因为json_finished并没有像你想象的那样直接工作。它仅在您调用getJSONfromDestination函数并将jsonfinished作为参数传递时才开始工作。资料来源:NodeJS系列#6:事件驱动编程Q9:什么是NPM?我什么时候需要在Node.js中使用NPM?NPM是Node.js中的包管理器。允许我们为Node.js安装各种模块,这个包管理器为我们提供了安装、删除和其他管理模块的命令。这里我们需要注意的一件事是,我们必须有一个package.json文件或一个node_modules目录才能在本地安装模块。NPM最好的事情之一是它在本地存储我们安装的依赖项,在package.json的依赖项对象中。例如,如果模块X使用模块A1.0版,模块Y使用模块A1.5版,则模块X或Y都将在本地拥有自己的模块A副本。//模块X{"name":"X","dependencies":{"A":"^1.0"}}//模块Y{"name":"Y","dependencies":{"A":"^1.5"}}需要NPM包我们在开发一些Node.js项目的时候,可能会遇到一些需要NPM的地方,比如链接Redis、MongoDB或者发送请求等,有了这些模块,我们就可以更专注于当然,为了业务发展,有时你会有一些特殊的需求。这时候你可能需要自己封装一个npm模块来实现复用。单击下面的源以阅读有关NPM的更多信息。资料来源:如何创建Nodejs模块并发布到NpmQ10:Node.js可以做什么?10个Node.js应用场景?Node.js可以作为Web服务器,command下面来看看Node.js的10个应用场景:Web开发:Express+EJS+MongoDB(mongoose)/MysqlREST开发:RestifyIMInstantChat:Express+Socket.ioWebCrawler:Cheerio/request博客系统:Hexo网络论坛:NodeclubWeb幻灯片:Cleaver前端构建工具:bower.jsOAuth认证:Passport定时任务工具:LaterSource:node.js是做什么的?Node.js的10个应用场景js本片文章首发于慕课:https://www.imooc.com/article/289202阅读推荐Nodejs-Interview-Questions-专注于Node.js面试和常见问题分享Nodejs技术栈-一份Node.js技术栈开发学习指南