Can we say node.js is a web server?

我发现我混淆了 Web 框架和 Web 服务器。

Apache is a web server.

Tornado is a web server written in Python.

Nginx is a web server written in C

Zend is a web framework in php

Flask/Bottle is a web framework in Python

RoR is a web framework written in Ruby

Express is a web framework written in JS under Node.JS

我们可以说 node.js 是一个 web 服务器吗? ? ? 我对 web 服务器/框架很困惑。

如果 node.js 是一种 webserver,而不是 webFramework (Express 是) ,为什么我们需要把整个 node.js 放在 Nginx 服务器上? Question on SO

谁能帮忙?

基特

65270 次浏览

Web 服务器是通过因特网通过协议为其客户端服务的东西,而 Web 框架就是我们称为编译器的东西。它由所有必需的库、语法规则等组成。

而 node.js 是一个框架! !

我将把 node.js 分类为服务器框架,其中包含可以将其用作 HTTP 服务器、 WebSocket 服务器或您自己的定制协议等的包。

您可能将 nginx 放在 node.js 服务器之前的原因是为了在运行服务器应用程序的多台机器上实现 HTTP 负载平衡和反向代理。

网络服务器

Web 服务器可以引用硬件(计算机)或 软件(计算机应用程序) ,有助于提供内容 可以通过互联网访问

网络服务器的主要功能是在 要求客户端。这意味着交付 HTML 文档和任何 additional content that may be included by a document, such as images, 样式表和脚本。

Web 服务器是在互联网上向客户/用户发送请求/页面的基础

Web 框架

Web 应用程序框架是设计的软件框架 支援动态网站、网上应用程式及 该框架旨在减轻与网络服务相关的开销 with common activities performed in Web development. For example, many 框架为数据库访问、模板化提供了库 框架和会话管理,并且它们常常促进代码重用。

一个 web 框架使用一个 webserver 来向客户端发送请求,但它不是 web 服务器。

Node.js

Js 是一个构建在 Chrome 的 JavaScript 运行时上的平台,可以很容易地 构建快速、可伸缩的网络应用程序 事件驱动的、非阻塞的 I/O 模型,使其变得轻量级和 高效,非常适合运行数据密集型实时应用程序 跨越分布式设备。

不过话又说回来,你也可以创建 CLI 应用程序,所以我认为你应该把它更多地看作一个平台,使用 Javascript 编程语言编写 javascript 程序在你的服务器(计算机)上运行,而不是像一开始那样只在浏览器中运行。我想你可以把它看作 Javascript++? ? ?

您还可以使用 node.js 编写 Web 服务器,正如您在 node.js 的首页上看到的那样。一开始 Ryan 说你可以把 Nginx放在 node.js 前面,因为这个项目很稳定。这个项目过去是,现在仍然是相当年轻的。Nginx 是一个经过验证的 Web 服务器,当 node.js 崩溃时,它会继续运行。很多用户只是使用 node.js。

我会说 Node.js是一个 执行期函式库或运行时引擎。

到目前为止,我发现的最好的定义可能来自 Rob Gravelle 的一篇题为 “ Node.js 入门”的文章:

Js 是部分执行期函式库和部分库,用于使用服务器端 JavaScript 构建网络应用程序。它使用 Chrome 的 JavaScript 运行时引擎直接执行 JS 代码,而不需要浏览器沙箱。

Also the PCMAG.COM Encyclopedia provides the 以下定义 of "runtime engine":

某些应用程序在计算机中运行所依赖的软件。运行时引擎必须在计算机中运行才能执行应用程序。它提供应用程序需要的常规例程和函数,并且它通常将程序转换成机器语言,这是一个临时的、中间语言的。

另外,题为“运行时系统”的 维基百科文章声明:

A run-time system (also called runtime system, runtime environment, or just runtime) implements the basic behavior of a computer language, whether the language is a compiled language, interpreted language, embedded domain-specific language, or is invoked via an API as is pthreads.

... 运行时系统可能实现任务的行为,如在屏幕上绘制文本或建立 Internet 连接。它还通常充当一个抽象层,隐藏了操作系统提供的服务的复杂性或变化。

那么,是否存在像 Node.js 这样的运行时环境(甚至是软件平台) ?我想 JRE 就是这种环境的一个很好的例子。Js 和 JRE ——它们有许多共同点。它们都有(一种)虚拟机、类库和框架来实现许多类型的应用程序,包括 CLI 应用程序。

那么,回到你的问题,我们可以说 Node.js 是一个网络服务器吗?让我们将“ Node.js”改为“ JRE”,并回答 JRE 是否是 Web 服务器。答案是否定的。

我们只能说 Node.js 是一个可以用来实现 web 服务器的执行期函式库。这是我的看法。

说节点是一个网络服务器就像说 javacript 只能在浏览器中运行,你可以这么说,但它也可以做很多其他的事情。

NodeJS

  1. [ Javascript 运行时环境(Chrome v8引擎) + Node 图书馆/应用程式介面]
  2. 可以创建一个网络服务器,也可以描述为一个 应用服务器

特快

  1. Web 框架(使用 nodejs 的 webserver 服务文件)

Nginx

  1. 网络服务器

In production most people use Nginx in front of node server as a proxy server to serve static files and other various elements like caching, routing etc.

我认为问题在于“ web 服务器”或“ web 应用服务器”的术语被 JEE 世界和产品所主导,这些产品不像当今的 Javascript 框架世界那样模块化,而这些框架又或多或少地可以自由组合。

我看不出为什么一个技术,可以通过网络服务复杂的应用程序,not应该被称为一个网络服务器,或网络应用服务器!

如果将 下一个作为前端,将 羽毛作为后端,那么您将拥有一个服务于 REST API 的后端和一个服务器端呈现的 UI!

当然,你可以(错误地)使用它来服务静态内容——然后我会称它为 Web 服务器,或者你可以使用它来制作和服务一个完整的应用程序——然后我会称它为 Web 应用服务器。

这些综合的特征或品质才能达到目的,对吧?- 诸如稳定性、可扩展性等特性,恕我直言,随着时间的推移,这些特性将被添加到这些技术中。现在看来,它们还很新。

不,这是一个执行期函式库... 所以它不是一个网络服务器,但它不需要一个运行。所以可能这就是为什么它会让人困惑。它可以独立运行而不需要任何网络服务器,因为它本身就是一个运行时,但同样它不是一个网络服务器。

我感受到了你的痛苦!

和许多人一样,我发现很难理解 Node.js 的本质,因为大多数人只写/谈论他们觉得有用的那部分 Node ——他们觉得有趣的部分通常是 Node 的次要好处,而不是它的主要目的。我必须说,我认为人们说 Node 只是一个 JavaScript 运行时是疯狂的。Node 对 JavaScript 的使用及其对 V8运行时的选择仅仅是 达到目的的手段,这是 Node 开发人员想要解决的问题的最佳工具。

Node 的主要目的是提高 Web 应用程序中用户事件的管理效率。所以 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年引入了 我保证结构,以便更容易和可读地处理异步调用。

为了帮助 Node 用户快速编写后端代码,Node 的开发人员还组织了一个内置的 JS 库用于例行任务(例如与 HTTP 请求、字符串(de)编码、流等相关的事项)和 NPM (Node Package Manager)存储库: 这是一个开源的、用户维护的脚本包集,用于各种标准和自定义功能。所有 Node 项目都允许通过建立的 < strong > npm install 命令将 NPM 包导入到项目中。

通过 Node 处理的用户请求将是 Web 应用程序所需要的,比如身份验证、数据库查询、内容管理系统(ApostropheCMS、 Strapi CMS)更新等。所有这些都将发送到 Node 端口。(如果分析从数据库获得的数据需要很多 CPU 时间,那么这种类型的进程最好放在单独的线程上,这样就不会减慢简单用户请求的速度。)其他类型的用户请求,例如加载另一个网页,下载 CSS/JS/image 文件等,将继续由浏览器发送到默认端口(通常端口80(HTTP)和443(HTTPS)在服务器机器上的 Web 服务器程序(Apache,NGinx 等)将处理他们在传统网站的模式。

[这里有一个关于请求流到服务器的附注。由于大多数服务器机器的防火墙只允许默认端口80/443打开,所以通常不允许 直接使用 URL 中的另一端口(例如 https://mynodeapp.com:3001/fetch-members )发送 Node.js 请求。如果有,服务器机器的防火墙会直接忽略它,因为它直接引用了一个非法端口。 相反,可以对没有明确端口号但包含虚拟文件夹名的请求应用一个 URL,该文件夹名识别 Node.js 应用程序,例如 https://mynodeapp.com/mynodeapp/fetch-members。然后将一些服务器指令代码附加到。Htaccess 文件如:

RewriteEngine On
RewriteRule ^mynodeapp/(.*) https://localhost:3001/$1 [P]

通过这种方式给定 URL 的 Node.js 请求将通过 Node 应用程序的指定端口(即本例中的3001)找到到该 Web 应用程序的 Node.js 服务器。]

So, in practice, Node is principally a framework for rapid server-creation and event-handling but one that replaces only some of the functions of the web server program.

Node 的其他非后端使用只是利用了它的一个或其他特性,例如 JavaScript V8引擎。例如,前端构建工具 Grunt咕噜使用一个前端 Node.JS 应用程序来处理构建脚本,这个脚本可以通过编码将 SASS 转换为 CSS,缩小 CSS/JS 文件,优化图像大小或图像加载,生成页面状态 HTML 文件以在单个页面应用程序站点中刷新页面状态,等等。但是这类工作实际上只是 Node 的副产品使用,而不是它的主要用途,即为现代 Web 应用程序制作高效的后端流程。

我刚刚第一次使用 Node.js 来创建 Discord 机器人。我的想法是“哇,Node.js 是一个服务器?我还以为是个 JS 图书馆呢!”或者我可以把它想象成一个框架。

它是一个网络服务器吗? 不,但你可以用它做一个。 它是一个服务器吗? 就像接收查询并提供结果的软件一样? 是的。

在我的情况下,我已经发出了命令: node index.js

现在 Node.js 正在等待响应请求(通过我的 bot)。是个服务器,但不提供网页服务。

尽管 Nodejs 被认为是一个非常酷、轻量级的执行期函式库,并且在 node 生态系统中包含了一个非常棒的名为 npm 的软件包管理器。您可以使用针对专用端口的 Express 框架创建 REST API、 Web 应用服务器。它基本上不需要任何网络服务器。 而 Web 服务器的主要任务是充当第7层的负载均衡器和代理服务器。根据行业标准,最常用的 Web 服务器是 nginx 由于可靠性。尽管您可以使用节点库和 Express 框架配置 http 代理服务器。