我一直在学习.js最近发现了一些关于编写简单 node 的material .基于js的服务器.例如,下面的例子.

var express = require("express"),
http = require("http"), app;

// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);

// set up our routes
app.get("/hello", function (req, res) {
    res.send("Hello World!");
});

app.get("/goodbye", function (req, res) {
    res.send("Goodbye World!");
});

现在,虽然我似乎理解了代码中发生的事情,但我对术语有点困惑.当我听到"服务器"这个词时,我会想到Apache或Nginx之类的东西.我习惯于认为它们就像一个容器,可以容纳我的web应用程序. node 是如何工作的.js服务器与Nginx/Apache服务器不同?一个 node 不是真的吗.基于js的服务器(即代码)仍然可以放在Nginx之类的东西中运行吗?那么,为什么两者都被称为"服务器"?

推荐答案

是服务器.

一个 node .js web应用程序是一个成熟的web服务器,就像Nginx或Apache一样.

你确实可以为你的 node 服务.js应用程序,无需使用任何其他web服务器.只需将代码更改为:

app = express();
http.createServer(app).listen(80); // serve HTTP directly

实际上,有些项目使用node.js作为其他服务器(包括Apache)的front-end负载平衡器.

注意这个 node .js并不是唯一一个这样做的开发堆栈.Go、Java和Swift中的Web开发框架也可以做到这一点.

为什么?

一开始是CGI.CGI很好,工作正常.Apache会收到一个请求,发现url需要执行一个CGI应用程序,执行该CGI应用程序并将数据作为环境变量传递,读取stdout并将数据返回浏览器.

问题是速度太慢了.当CGI应用程序是一个小的静态编译C程序时,这没关系,但是一组小的静态编译C程序变得很难维护.于是人们开始用脚本语言写作.然后,这变得很难维护,人们开始开发面向对象的MVC框架.现在我们开始遇到麻烦了——每个请求都必须编译所有这些类,并创建所有这些对象,以便为一些HTML服务,即使没有动态服务(因为框架需要弄清楚没有动态服务).

如果我们不需要在每个请求中创建所有这些对象呢?

人们就是这么想的.为了解决这个问题,我们采取了几种策略.最早的方法之一是将解释器直接嵌入到web服务器中,比如Apache中的mod_php.编译后的类和对象可以存储在全局变量中,因此可以缓存.另一个策略是进行预编译.还有一种策略是将应用程序作为常规服务器进程运行,并使用自定义协议(如FastCGI)与web服务器进行通信.

Then some developers started simply using HTTP as their app->server protocol. In effect, the app is also an HTTP server. The advantage of this is that you don't need to implement any new, possibly buggy, possibly not tested protocol and you can debug your app directly using a web browser (or also commonly, curl). And you don't need a modified web server to support your app, just any web server that can do reverse proxying or redirects.

为什么要使用Apache/Nginx?

当你为一个 node 服务时.js应用程序请注意,您是自己的web服务器的作者.应用程序中的任何潜在漏洞都是互联网上可直接利用的漏洞.有些人(有理由)对此感到不舒服.

在 node 前面添加一层Apache或Nginx.js应用程序意味着你在实时互联网上有一个经过战斗测试、安全加固的软件作为你应用程序的接口.它增加了一点延迟(反向代理),但大多数人认为它值得.

这曾经是node早期的标准建议.js.但现在也有一些网站和web服务公开了 node .js直接连接到互联网.http.Server模块现在已经在互联网上进行了相当好的作战测试,值得信赖.

Node.js相关问答推荐

对接Nestjs/VueJS应用程序

如何将信号从终端窗口发送到运行在Raspberry Pi上的Puppeteer/Node.js上的webscraper

聚合发布/订阅消息

无法使用Sequelize连接AWS RDS

try 使用Express和连接池将数据插入MySQL数据库时出现拒绝访问错误

如何在Sequelize with Postgres中将m:n关联表ID从整数迁移到UUID?

如何创建具有不同对象类型的数组类型

express app.post的多个参数在Node.js中的定义是什么

mongoose 7.0.3 使用运算符 $and 严格搜索日期

使用正则表达式查找文档,但输入是数组

如何使用 node 在 koa.js 中发送响应

更新文档数组中的文档 Mongoose

Node.js |如何在微服务之间转发标头?

用户与mongoose 的完美搭配

类型中缺少属性,该类型是由类实现的接口

node.js 是否支持yields ?

如何将`yarn.lock`与`package.json`同步?

如何在 node 中找到引用站点 URL?

代理(如提琴手)可以与 Node.js 的 ClientRequest 一起使用吗

当进程被杀死时,如何优雅地关闭我的 Express 服务器?