我能感同身受!跟许多人一样,我发现很难理解Node.js的实质,因为大部分人只写/谈论他们所使用的Node部分 - 而他们感兴趣的部分通常是作为Node的次要好处而不是其主要目的。我必须说,我认为人们说Node只是JavaScript运行时简直是疯了。Node对JavaScript的使用 - 以及选择V8运行时 - 只是一种手段,是Node开发者想要解决问题的最佳工具。
Node的主要目的是使网页应用程序中用户事件的管理更加高效。因此,Node在Web应用程序的后端被极大地使用。事件管理需要在服务器机器上有监听这些用户事件的东西。因此,必须设置一个HTTP服务器来将每个事件路由到其相应的处理程序脚本。Node提供了快速设置服务器以便在专用端口上侦听用户请求的框架。Node使用JavaScript来处理事件,因为JavaScript允许函数作为对象进行调用。这允许任务立即在异步请求(例如文件系统、数据库或网络)之后执行,并将其封装在函数中,并将其引用作为异步请求函数调用的参数。
const mysql = require('mysql2');
const conn = mysql.createConnection(
{
host: "XXXXXXXXXXXXX",
database: "doa_statsbase",
user: "uoalabama_doas",
password: "*************"
});
. . .
. . .
const analyse_bigwheat_farmers = (err, result, fields) =>
{
. . . . .
. . . . .
return data_object;
}
. . .
. . .
let query = "SELECT * FROM us_farmers WHERE acreage > '1000' AND crop='wheat'";
mysql.query(query, (err, result, fields) =>
{
analyse_bigwheat_farmers(err, result, fields);
}
. . .
. . .
. . .
不多数语言将函数视为对象,而那些这样做的语言可能没有像Google的V8运行时一样高效的解释器。大多数Web开发人员已经了解JavaScript,因此在使用Node时无需学习其他语言。拥有回调函数使所有用户任务能够放置在单个线程上,而不需要将显式阻塞应用于需要访问数据库或文件系统的任务。这就是在重度并发使用下导致Node具有优越执行效率的原因 - 这是其开发的主要目的。
如今,大多数Node Web应用程序仅适度使用回调函数,因为JavaScript ES6于2015年引入了“Promise”构造,以更轻松和可读的方式处理异步调用。
为了帮助Node用户快速编写后端代码,Node的开发人员还组织了一个内置的JS库,用于常规任务(例如与HTTP请求、字符串(解)编码、流等相关的事项),以及NPM(Node Package Manager)存储库:这是一个开源的、由用户维护的脚本包集,用于各种标准和自定义功能。通过已建立的“npm install”命令,所有Node项目都允许将NPM包导入到项目中。
通过Node处理的用户请求将是Web应用程序所需的内容,例如身份验证、数据库查询、内容管理系统(ApostropheCMS、Strapi CMS)更新等。所有这些请求都将被发送到Node端口。(由数据库得到的数据的分析需要大量的CPU时间,这种类型的处理最好放在单独的线程中,以便不会减缓更简单的用户请求。)其他类型的用户请求(例如加载另一个网页、下载CSS/JS/image文件等)将继续由浏览器发送到默认端口(通常是服务器机器上的端口80(HTTP)和443(HTTPS),其中Web服务器程序(Apache、NGinx等)将以传统网站的模式处理它们。
在此对服务器的请求进行流式传输的一个副备注释。由于大多数服务器机器的防火墙只允许默认端口80/443打开,因此通常不允许在URL中直接发送带有另一个端口的Node.js请求,例如https://mynodeapp.com:3001/fetch-members。如果这样做,服务器机器的防火墙将简单地忽略它,因为它直接引用了非法端口。
相反,可以将一个不含显式端口号但包含标识Node.js应用程序的虚拟文件夹名称的URL应用于该请求,例如https://mynodeapp.com/mynodeapp/fetch-members。然后,在.htaccess文件中附加一些服务器指令代码:
RewriteEngine On
RewriteRule ^mynodeapp/(.*) https://localhost:3001/$1 [P]
因此,以这种方式给定的URL请求将通过Node应用程序的指定端口(例如在此示例中为3001)找到其路径,最终到达Node.js服务器,用于快速创建服务器和处理事件的框架,但仅替换Web服务器程序的某些功能。
Node的其他非后端用途只是利用其某些功能,例如JavaScript V8引擎。例如,前端构建工具Grunt和Gulp使用前端Node.js应用程序来处理可以编码转换SASS为CSS、压缩CSS/JS文件、优化图像大小或图像加载、为单页应用程序网站生成页面状态HTML文件等的构建脚本。但这种工作实际上只是Node的副产品用途,而不是其主要用途,其主要用途是为现代Web应用程序制作高效的后端进程。