Node.js:构建高性能实时Web应用的现代框架
Node.js是现代Web开发中一个重要的框架,它简化了高性能、实时Web应用程序的创建过程。Node.js允许JavaScript在服务器端和客户端端到端使用。本教程将引导您完成Node.js的安装,并演示如何编写第一个“Hello World”程序。最终,您将学习如何使用Node.js和Express构建一个天气API。
传统上,JavaScript只能在Web浏览器中运行,但由于人们对将其引入服务器端的兴趣日益浓厚,Node.js应运而生。
Node.js与其他服务器技术略有不同,因为它基于事件而非基于线程。用于服务PHP和其他CGI脚本的Apache等Web服务器是基于线程的,因为它们为每个传入请求生成一个系统线程。虽然这对于许多应用程序来说足够了,但基于线程的模型在处理许多长期连接(例如,服务实时应用程序(如即时消息应用程序)所需的连接)时扩展性不佳。
“Node.js中的每个I/O操作都是异步的……”
Node.js使用事件循环而不是线程,能够扩展到数百万个并发连接。它利用了服务器大部分时间都在等待I/O操作(例如,从硬盘读取文件、访问外部Web服务或等待文件上传完成)这一事实,因为这些操作比内存操作慢得多。Node.js中的每个I/O操作都是异步的,这意味着服务器可以在I/O操作进行时继续处理传入请求。JavaScript非常适合基于事件的编程,因为它具有匿名函数和闭包,这使得定义内联回调变得轻而易举,而且JavaScript开发人员已经知道如何以这种方式进行编程。这种基于事件的模型使Node.js非常快速,并且使实时应用程序的扩展非常容易。
Node.js官方支持Linux、macOS、Microsoft Windows、SmartOS和FreeBSD。要在Windows(v16及更高版本)上安装最新版本的Node.js,您的计算机必须运行Windows 8.1、10或11。
Node.js内置了自己的包管理器,称为节点包管理器(简称npm),它允许您从npm注册表安装第三方模块。
npm -v
以查看npm版本。此外,如果您在程序中搜索Node,您应该会找到Node.js命令提示符。
命令提示符提供了一个REPL(读取-评估-打印循环),您可以在其中键入JavaScript Node.js代码,并立即评估代码并输出结果。您还可以将JavaScript从外部文件加载到REPL会话中等等。
学习任何新技术都始于“Hello World!”教程,因此我们将创建一个简单的HTTP服务器来提供该消息。
首先,我们将创建一个新的Node.js项目。为此,请打开您的终端,切换到您希望项目所在的目录,然后运行以下命令:
npm init
系统会提示您提供有关库的一些信息,包括库名称、作者、入口文件、许可证和版本,完成后,将使用提供的信息创建一个package.json文件。要跳过此步骤,请附加require
函数,如下所示(在test.js内部):
var util = require("util");
这将加载util
模块,该模块包含用于处理系统级任务(例如将输出打印到终端)的实用程序函数。要在模块中使用函数,请在存储模块的变量上调用它——在本例中,使用文件名作为参数的node命令。
node test.js
运行此命令将在命令行输出“Hello World!”。
要创建HTTP服务器,您必须使用http
模块。
var util = require("util"); var http = require("http"); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('Hello World!'); res.end(); }).listen(8080); util.log("Server running at https://localhost:8080/");
此脚本导入http
模块并创建一个HTTP服务器。传递给http.createServer()
的匿名函数会在接收到请求时执行。在浏览器中访问http://localhost:8080/
,您将看到Hello World!。
好的,我们已经构建了一个HTTP服务器,但是无论您访问哪个URL,它除了“Hello World”之外什么也不会发送。任何HTTP服务器都必须能够发送静态文件,例如HTML文件、图像和其他文件。以下代码就是这样做的:
var util = require("util"), http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); http.createServer(function(request, response) { var uri = path.parse(request.url).base; var filename = path.join(process.cwd(), uri); fs.access(filename, fs.constants.F_OK, function(err) { if(err) { response.writeHead(404, {"Content-Type": "text/plain"}); response.write("404 Not Found\n"); response.end(); return; } fs.readFile(filename, "binary", function(err, file) { if(err) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(err "\n"); response.end(); return; } response.writeHead(200); response.write(file, "binary"); response.end(); }); }); }).listen(8080); util.log("Server running at http://localhost:8080/");
我们首先需要在代码中使用所有模块。这包括http
、path
和url
模块,用于解析请求的传入URL并找到被访问文件的路径名。我们使用process.cwd()
(或当前工作目录)和请求文件的路径来查找服务器硬盘上的实际文件名。
接下来,我们检查文件是否存在,这是一个异步操作,因此需要回调函数。如果文件不存在,则向用户发送404 Not Found消息,并且函数返回。否则,我们使用fs.readFile()
读取文件。如果在浏览器中访问http://localhost:8080/path/to/file
,则该文件将显示在您的浏览器中。
在我们的静态文件服务器的基础上,我们将构建一个Node.js服务器,该服务器获取并显示给定城市的预期天气状况。首先,在这个示例中,我们将需要两个额外的第三方模块:axios
模块和express
模块。Express是一个用于在Node.js应用程序中构建RESTful API的Web框架。我们将使用Express模块构建一个单一的API端点,该端点将从每个请求中获取城市,并使用包含该城市预报天气状况的HTML正文进行响应。天气信息将来自外部API——因此我们将使用axios
客户端发出API请求。
首先,我们将同时使用以下命令安装express
和axios
模块:
npm i express axios
这将从npm注册表安装这两个模块。用以下代码替换app.get()
代码:
app.get('/', (req, res) => { let city = req.query.city; axios.get(`https://api.openweathermap.org/data/2.5/forecast?q=${city}&appid=${apikey}`) .then((response) => { if(response.status === 200) { res.send(`The weather in your city "${city}" is <br> ${response.data.list[0].weather[0].description}`) } }) .catch((err) => { console.log(err); }) })
我们首先从query
属性中检索查询字符串(city)。
然后,我们使用axios
向天气预报API发出GET请求。URL将需要两个变量:我们要获取预报的city和在Open Weather API信息中心提供的唯一API密钥。
我们设置了一个res.send()
方法。发生错误时,我们只需通过在命令行上运行node test.js
并将以下URL键入浏览器中,即可将错误数据记录到控制台:
<code>http://localhost:3000/?city=nairobi</code>
请注意,nairobi可以替换为您选择的任何城市。以下是您应该获得的结果。
Node.js是一项非常令人兴奋的技术,它简化了高性能实时应用程序的创建过程。我希望您能够看到它的好处,并能够在您自己的某些应用程序中使用它。由于Node.js具有强大的模块系统,因此很容易在您的应用程序中使用开源第三方库,并且几乎所有内容都有可用的模块:包括数据库连接层、模板引擎、邮件客户端,甚至连接所有这些内容的完整框架。
祝您Node.js编程愉快!
此文章已更新,并包含Kingsley Ubah的贡献。Kingsley热衷于创作教育和启发读者的内容。爱好包括阅读、足球和骑自行车。
以上是使用node.js学习服务器端JavaScript的详细内容。更多信息请关注PHP中文网其他相关文章!