构建node.js基础镜像
以下是 manning.com出版的《 用Node.js进行编程 》一书的摘录 。 您可以使用代码fccwexler以37%的折扣价在这里购买这本书。
本文是使用Node.js的实用介绍。 我们将介绍安装Node.js,了解npm的知识,然后构建一个Node.js模块并直接初始化Web服务器。 阅读时,随时在家中跟随!
安装Node.js
Node.js越来越受到欢迎和支持。 因此,要下载的新版本被部署得非常频繁,因此务必与最新版本保持最新,以了解它们可能对您正在构建的应用程序有何好处或影响。 在撰写本文时,要下载的Node.js版本为7.6或更高。
注意:Node.js 7.6的发行版支持ES6语法。 ES6(ECMAScript 2015)是对JavaScript的最新更新,对语法的改进使它可以完全定义变量,函数和OOP代码。 为了跟上JavaScript的更新,请在开发过程中下载最新稳定的Node.js版本。
有几种下载和安装Node.js的方法,所有方法都列在Node.js主站点上 。
由于Node.js与平台无关,因此您可以在macOS,Windows或Linux上下载并安装它,并期望其具有完整的功能。
安装Node.js的最简单方法是转到下载链接,然后按照说明和提示下载安装程序以获取最新版本的Node.js。
注意:安装Node.js时,还会获得npm,即外部库的Node.js生态系统(其他人编写的代码的多个文件),可以将其导入到将来的项目中。 在下一节中,您将了解有关npm的更多信息。
图1. Node.js安装程序页面
下载安装程序文件后,从浏览器的下载面板或计算机的下载文件夹中双击该文件。 安装程序将打开一个如图1所示的新窗口,并将所有必需的文件和核心Node.js库写入系统。 可能会要求您接受许可协议或授予安装程序许可,以将Node.js安装到您的计算机上。 按照提示单击以完成安装。
图2. Node.js写入您的计算机
终端和您的路径
您将主要在计算机的终端上工作,该终端是内置软件,用于在没有图形界面的情况下导航和运行计算机上的命令。 这本书讲授如何使用Unix终端(Bash)命令。 那些使用Windows的用户可以使用Window的CMD终端窗口进行跟踪(您可能需要在整本书中查找等效命令)。 您可以参考该表比较Windows和Unix命令。 为了使Windows上的操作更轻松,您可以从git-scm.com下载并安装一个名为GitBash的其他Bash终端。
记下您的计算机上安装Node.js和npm版本的位置。 此信息显示在安装程序的最后一个窗口中。 安装程序尝试将这些目录位置添加到系统的PATH中。
您的计算机的PATH变量是终端查找用于开发的资源的第一位。 可以将其视为计算机的索引,以快速找到所需的工具。 通过将这些工具的原始文件路径或目录位置添加到PATH变量中,终端在查找它们时不会有任何问题。 如果您在终端中启动Node.js遇到任何问题,请按照此处的安装步骤进行操作。
确保一切均已正确安装
现在,您已经安装了Node.js,让我们使用终端来确保所有内容均已正确安装。 打开终端(或GitBash),并在提示符下键入以下命令: node-v
。
该命令的输出应显示刚刚安装的Node.js的版本。 同样,您可以通过在命令提示符处运行命令npm -v
来检查已安装的npm版本。
注意:如果您的终端响应错误或根本没有响应,则可能是您的Node.js安装未成功。 如果出现错误,请尝试将该错误复制并粘贴到搜索引擎中以查找常见的解决方案,或者只是尝试重复安装过程。
![](https://i-blog.csdnimg.cn/blog_migrate/72bb2237419e8026f5991122f1eda245.png)
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
现在您已经安装了Node.js并正在运行终端,您需要在某个地方编写代码。 尽管文本编辑器有许多不同的形式,也可以用于制作非代码文件,但是专门为开发人员设计的文本编辑器通常预先包装了有用的工具和插件。 我建议安装Atom文本编辑器,您可以从atom.io下载。
提示:如果您忘记了Node.js或npm的安装位置,则可以打开命令窗口,并在提示符下键入which node
或which npm
来查看相应的位置。 在Windows命令行提示符下,使用where
代替which
。
规划您的应用
想象一下,您想为您所在城市的社区支持农业(CSA)俱乐部构建应用程序。 通过此应用程序,用户可以订阅以从本地农场和分销商那里接收食物。 该应用程序可确保您的社区获得健康食品并保持联系。 您打算使用Node.js来构建此Web应用程序,并且您首先要验证用户的邮政编码以查看他们是否足够靠近交付地点。 问题是:您是否需要构建自己的工具才能实现这一目标?
对我们来说幸运的是,答案是否定的,npm可用于安装Node.js程序包,其他人编写的代码库,可用于向应用程序添加特定功能。 实际上,有一个用于根据邮政编码验证位置的软件包。 我们将仔细研究该软件包及其安装方法。
创建一个Node.js模块
Node.js应用程序最终由许多JavaScript文件组成。 为了使您的应用程序井井有条,高效,这些文件需要在必要时有权访问彼此的内容。 每个文件(其代码共同相关)称为模块。 让我们再次看一下我们的应用程序,并向其中添加一些积极的信息。 您可以使用以下代码创建一个名为messages.js
的文件:
let messages = ["You are great!", "You can accomplish anything!", "Success is in your future!"];
将这些消息与要编写的代码分开显示,将使代码更有条理。 要在另一个文件中管理这些消息,您需要更改let
变量定义以使用导出对象,如下所示:
exports.messages =["You are great!", "You can accomplish anything!", "Success is in your future!"];
就像其他JavaScript对象一样,您正在Node.js导出对象上添加messages
属性,该属性可以在模块之间共享。
注意: exports
对象实际上是moduleobject
的属性。 module
既是Node.js中代码文件的名称,也是其全局对象之一。 利用exports
本质上是一个速记module.exports
。
该模块已准备好由另一个JavaScript文件要求(导入)。 您可以通过创建另一个名为printMessages.js
文件进行测试,该文件的目的是遍历消息并将它们与清单1中的代码一起记录到控制台中。首先,使用require
对象和模块的文件名来require
本地模块(带有或不带有.js扩展名)。 然后,通过在printMessages.js
设置的变量来引用模块的数组。
清单1.在printMessages.js
消息记录到控制台
const messageModule = require(’./messages’); 1
messageModule.messages.forEach( (m) => { 2
console.log(m);
});
- 需要本地
messages.js
模块。 - 通过
messageModule.messages
模块的数组。
require
是另一个Node.js全局对象,用于在本地引入其他模块中的方法和对象。 Node.js解释require('./messages');
在项目目录中查找名为messages.js
的模块,并允许printMessages.js
代码使用添加到导出对象的任何属性。
接下来,我们将使用npm,这是另一个将模块添加到项目中的工具。
运行npm命令
在安装Node.js的同时,您还获得了Node Package Manager (npm)。 顾名思义,npm负责管理应用程序中的外部软件包(其他人已经构建并在线提供的模块)。 在整个应用程序开发中,npm将用于安装,删除和修改这些软件包。 在终端中输入npm -l
会显示一个npm命令列表,并带有简要说明。
清单2包含一些您将要了解的npm命令。
清单2.要了解的Npm命令
-
npm init
。 初始化Node.js应用程序并创建package.json
文件 -
npm install <package>
。 安装Node.js软件包。 -
npm publish
。 将您构建的软件包保存并上传到npm软件包社区。 -
npm start
。 运行您的Node.js应用程序(前提是将package.json
文件设置为使用此命令)。npm stop
将退出正在运行的应用程序。
使用npm install <package>
,在命令后附加--save
会将软件包安装为应用程序的依赖项。 附加--global
将软件包全局安装在您的计算机上,以在终端中的任何位置使用。 这些命令扩展(称为标志)分别具有-S
和-g
的简写形式。 npmuninstall <package>
撤消安装操作。 如果项目需要,可以使用npm install express -S
来安装Express.js框架,而npm install express-generator -g
可以安装Express.js生成器以用作命令行工具。
模块和包装
在使用Node.js进行开发的整个过程中,您会听到很多术语模块和程序包。 这是您需要了解的内容:
- 模块是单独JavaScript文件,其中包含与单个概念,功能或库有关的代码。
- 软件包可以包含多个模块或单个模块。 软件包用于将提供相关工具的文件分组在一起。
注意:“依赖关系”是应用程序或其他模块使用的Node.js模块。 如果将软件包视为应用程序依赖项,则必须安装该软件包(以该应用程序指定的版本),然后才能期望该应用程序成功运行。
如果您想将某些功能合并到应用程序中,则可能可以在npmjs.com上找到一个软件包来执行该任务。 让我们继续,并添加基于其邮政编码查找用户所在位置的功能。
为此,我们将需要安装cities
包 ,用于将文本地址转换为位置坐标。 但是,在成功安装软件包之前,我们仍然缺少该项目中的一件事。 我们需要正确地初始化一个Node.js项目,并创建一个npm用于安装cities
的package.json
文件,我们将在下一部分中进行操作。
快速检查练习 :如果要在计算机上全局安装软件包,请使用哪个标志?
初始化Node.js应用程序
每个Node.js应用程序或模块都将包含package.json
文件,以定义该特定项目的属性。 该文件位于项目的根级别。 通常,在此文件中,您可以指定当前发行版的版本,应用程序的名称以及主应用程序文件。 该文件对于npm将任何软件包在线保存到节点社区很重要。
首先,创建一个名为zip_connection
的文件夹,在终端中导航到您的项目目录,然后使用npm init
命令初始化您的应用程序。 系统将提示您填写项目的名称,应用程序的版本,简短说明,将要启动应用程序的文件的名称(入口点),测试文件,git存储库,您的名称(作者)和许可证代码。 现在,只需确保输入您的姓名,然后按Enter键即可接受所有默认选项。 确认所有这些更改之后,您应该在项目目录中看到一个类似于清单3内容的新package.json
文件。
清单3. zip_connection
项目中package.json
文件的结果
{
"name": "zip_connection",
"version": "1.0.0",
"description": "An app to promote locally sourced food.",
"main": "printMessages.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Jon Wexler",
"license": "ISC"
}
此示例package.json
包含名称,版本,描述,起始文件,自定义脚本,作者和许可证。
现在,您的应用程序具有保存和管理应用程序配置和程序包的起点。 您应该能够通过导航到项目文件夹并在终端中运行以下命令来安装cities
:
npm install cities --save
同样,通过此安装,您的项目文件夹将刚刚获得一个名为node_modules
的新文件夹。 您刚刚安装的城市包的代码内容位于此文件夹中。
提示: --save
标志将保存cities
包作为这个项目的依赖。 现在检查您的package.json
文件,以查看该软件包如何在依赖项下列出。 由于您的node_modules
文件夹的大小会增加,因此当您在线共享项目代码时,不建议将其包括在内。 但是,下载项目的任何人都可以输入npm install
来自动安装此文件中列出的所有项目依赖项。
通过将清单4中的行添加到main.js
来测试这个新包。 我们首先需要本地安装的cities
软件包,并在此文件中提供该软件包。 然后,我们将使用“ cities
包中的zip_lookup
方法通过其邮政编码查找城市。 结果存储在名为myCity
的变量中。
清单4.在main.js
实现城市包
const cities = require(’cities’);
var myCity = cities.zip_lookup(10016);
console.log(myCity);
上面的代码执行以下操作:
- 需要
cities
套餐。 - 使用
zip_lookup
方法存储生成的城市。 - 将结果记录到控制台。
该邮政编码生成的数据被打印到控制台,如清单5所示。
清单5.在终端中运行main.js
示例结果
{ zipcode: ’10016’,
state_abbr: ’NY’,
latitude: ’40.746180’,
longitude: ’-73.97759’,
city: ’New York’,
state: ’New York’ }
zip_lookup
方法返回带有坐标的JavaScript
对象。
快速检查练习 :哪个终端命令使用
package.json
文件初始化Node.js应用程序?
在Node.js中构建一个简单的Web服务器
技术社区大肆宣传Node.js及其将JavaScript作为服务器端语言的使用,而这正是我们现在要做的:构建它!
本节介绍http
模块的一些基本功能, http
模块是一个Node.js代码库,用于处理Internet上的请求。 通过一些简短的步骤,您将把几行JavaScript转换为一个可在Web浏览器上进行通信的应用程序。 Web服务器是大多数Node.js Web应用程序的基础。 它们允许您将图像和HTML网页加载到应用程序的用户。
让我们考虑一下我们正在使用的应用程序,以通过相同的邮政编码连接用户。 在交付完整的应用程序之前,社区可能希望看到一个简单的站点,该站点具有将来可以改进和添加功能的灵活性。 您认为构建原型需要多长时间?
借助Node.js,您可以使用http
模块获取具有数小时内构建的足够功能的Web服务器。
了解Web服务器
在开始之前,让我们讨论一些重要的Web服务器概念。 毕竟,如果您对结果有明确的期望,最终产品的外观和感觉会好很多。
Web服务器和HTTP
Web服务器是一种软件,旨在通过加载或处理数据来响应Internet上的请求。 可以将网络服务器想象成银行柜员,其工作是处理您的存款,取款或只是查看帐户中的资金的请求。 就像银行出纳员遵循确保其正确处理您的请求的协议一样,Web服务器也遵循超文本传输协议(HTTP),该协议是全球范围内观察到的用于查看网页和通过Internet发送数据的标准化系统。
客户端(计算机)和服务器进行通信的一种方式是使用HTTP动词。 这些动词指示正在发出什么类型的请求。 例如,用户是要加载新网页还是在更新个人资料页面中的信息? 用户与应用程序交互的上下文是请求-响应周期的重要组成部分。
这是您将遇到的两种最广泛使用的HTTP方法:
-
GET
。 此方法用于从服务器请求信息。 通常,服务器会响应您可以在浏览器中查看的内容(例如,单击链接以查看网站的主页)。 -
POST
此方法用于将信息发送到服务器。 在处理完您的数据(例如填写并提交注册表格)之后,服务器可能会响应HTML页面或将您重定向到应用程序中的另一个页面。
考虑当您访问google.com时会发生什么。 在幕后,您实际上是在向Google的服务器发出请求,然后服务器将响应发送回给您,从而渲染其著名的“ Google搜索”登录页面。 这种请求-响应关系允许用户与应用程序之间进行通信。 请注意,在图3中,如何将数据包以请求的形式发送到应用程序的服务器,并且一旦服务器处理了请求,它将以响应的形式发回数据束。 这就是您与Internet上大多数互动的便利方式。
图3. Web服务器根据请求发送您的浏览器网页,图像和其他资源
输入要在浏览器中查看的URL时,HTTP请求将发送到其他位置的物理计算机。 该请求包含一些信息,这些信息指示您是要加载网页还是要向该计算机发送信息。
您可能会构建一个花哨的应用程序,但核心是Web服务器,将其通信传递到Internet上。 当您练习得越多,这些概念将越有意义。 现在,让我们开始构建我们的Web服务器。
快速检查练习 :Web服务器从客户端收到什么,并发回什么?
使用npm初始化应用程序
要开始使用Node.js Web应用程序,首先需要在终端上的项目文件夹中初始化项目。 打开一个终端窗口,并使用mkdir
创建一个名为simple_server
的新目录。 您可以使用npm init
初始化项目。
注意:npm代表节点程序包管理器。 您的节点项目依靠此工具来安装和构建Node.js应用程序。
运行npm init
命令会提示创建一个package.json
文件(图4)。 如提示所述,您将逐步在此文件中配置Node.js应用程序的最基本设置。
图4.填写Node.js初始化程序提示
现在,您可以添加main.js
作为入口点,简短描述,您的姓名作为作者,并选择使用通过按Enter键直到提示结束的默认值。
然后,将要求您通过package.json
文件的预览确认设置。 按Enter确认并返回到常规终端提示。
编写应用程序代码
在本文开头安装Node.js时,核心库也已安装。 在该库中有一个名为http
的模块,我们前面已经讨论过。 这就是您用来构建Web服务器的方法。 我们还将使用另一个名为url
核心模块来检查我们在网络浏览器中访问的URL的内容。
注意:请记住,Node.js中的模块是打包为为您的应用程序提供特定功能的代码库。 在这里, http
模块可帮助您使用HTTP在Web上进行通信。
在文本编辑器中,创建一个名为main.js
的新文件,并将其保存在包含上面创建的package.json
文件的项目文件夹中。 该文件将用作核心应用程序文件,并且您的应用程序将在此位置上为用户提供网页。 在以下应用程序中,我们将使用“ cities
包根据提供的邮政编码来确定城市。 我们将从URL的末尾(查询参数)获取邮政编码。 该参数遵循URL路径,从问号和键值对开始。 在我们的示例中,我们将使用zipCode作为密钥,并为其提供一些邮政编码值。 例如,如果我访问http://localhost:3000/?zipCode=10016
我将提取邮政编码1006,然后发现城市是纽约!
在分析我们将要构建的内容的各个方面之前,让我们看一下所有代码。 代码的第一行要求您导入名为http
和url
特定Node.js核心模块。 我们将这两个模块与cities
模块一起保存为常量,因为我们不希望这个值像普通变量那样变化。 我们使用http
变量作为对http
模块创建服务器的引用。 在ES6中,通常用括号括起来的参数构造回调函数,后跟⇒
而不是function
关键字。 在此代码块中,我们在回调函数中使用response参数将内容发送回用户的请求。 第一行使用writeHead
方法为响应的HTTP标头定义一些基本属性。 在这种情况下,我们将返回200响应代码和html content-type
以指示服务器已成功接收请求,并将以HTML形式返回内容。 此代码采用服务器实例,服务器,并运行listen
方法以指示服务器已准备好在端口3000接收传入的请求。在提交响应之前,我们使用url
模块使用以下命令在请求URL的末尾提取查询: url.parse(request.url, true).query;
。
使用if
语句,我们检查是否存在可以与query.zipCode
使用的邮政编码参数。 如果有的话,我们将在cities.zip_lookup(query.zipCode)
行和链.city
使用其值从结果中提取城市的名称。 否则,我们将城市设置为“未找到”。 最后,我们将一些HTML文本和与提供的邮政编码相关联的城市返回给用户屏幕。
清单6. main.js
简单Web应用程序代码
const cities = require(’cities’);
const url = require(’url’);
const http = require(’http’);
const app = http.createServer((request, response) => {
var city, query;
query = url.parse(request.url, true).query;
if (query.zipCode) city = cities.zip_lookup(query.zipCode).city;
else city = "not found"
response.writeHead(200, {"Content-Type": "text/html"});
response.write(`<h1>The city you are in is ${city}.</h1>`);
response.end();
});
app.listen(3000);
-
const cities = require('cities');
:需要必要的模块。 -
const app = http.createServer((request, response) =>
设置服务器并提取查询参数。 -
if (query.zipCode) city = cities.zip_lookup(query.zipCode).city;
:从邮政编码检查城市结果。 -
response.writeHead(200, {"Content-Type": "text/html"});
:设置响应。 -
app.listen(3000);
:告诉服务器侦听端口3000。
这就是它的全部荣耀! 没那么可怕。 仅需几行代码,您就可以构建这样的Web服务器。 试试看!
注意:如果您未指定端口号,则操作系统将为您选择一个端口。 该端口号是您不久将用于通过Web浏览器确认Web服务器正在运行的端口号。
Node.js中的回调
使Node.js如此快速和高效的部分原因在于它对回调的使用。 回调对于JavaScript来说并不是新事物,但是在整个Node.js中都大量使用了回调,因此值得一提。
回调实质上是一个匿名函数(无名称的函数),该函数设置为在另一个函数完成时立即调用。 回调的好处是您不必在运行其他代码之前就等待原始函数完成处理。
考虑通过将图片上传到银行的移动应用程序来虚拟地将支票存入您的银行帐户。 回调等同于几天后收到通知,让您知道支票已通过验证并已存入。 在这段时间之间,您可以按照自己的常规进行。
在http
Web服务器示例中,滚动接收来自客户端的传入请求,并随后将请求和响应作为JavaScript对象传递给回调函数。
警告:方法名称区分大小写。 例如,使用createserver()将引发错误。
createServer()
方法会生成http.Server
的新实例,该实例是内置的Node.js类,带有用于评估HTTP通信的工具。 使用此新创建的服务器实例,您的应用程序已准备好接收HTTP请求并发送HTTP响应。 createServer()
的参数是一个回调函数,只要服务器内发生某个事件,就会调用该函数。 例如,一旦服务器运行并且访问了应用程序的根URL(主页),则HTTP请求事件将触发此回调并允许您运行一些自定义代码。 在这种情况下,服务器将返回简单HTML响应。
注意:200是“ OK”的HTTP状态代码,用于指示在HTTP响应标头中返回内容没有问题。 要获取其他HTTP状态代码的列表, http.STATUS_CODES
在Node.js REPL Shell中输入http.STATUS_CODES
。
在该行的正下方,您正在使用write()
在响应中write()
一行HTML,并使用end()
关闭该响应。 您必须以end()
结束响应,以告诉服务器您不再编写内容。 否则,连接将保持打开状态以发送更多响应,并且服务器最终将永远不会认为响应已完成。
使用此代码后,您就可以从终端启动Node.js应用程序了。
快速检查练习 :为什么要使用const而不是var将HTTP服务器存储在应用程序中?
运行应用程序
最后一步很简单:使用终端浏览到项目目录,并在终端窗口中运行节点main.js
接下来,打开任何浏览器到地址localhost:3000
。 您不会在终端窗口中看到服务器已启动的任何指示,但是很快您将在浏览器中看到一切正常运行。 您的终端窗口应类似于图5。
图5.运行基本的Node.js服务器
首先,浏览器窗口应显示未找到城市。 接下来,尝试通过访问http://localhost:3000/?zipCode=10016
添加邮政编码作为查询参数。 浏览器窗口应将城市显示为纽约,如下图所示。 恭喜你! 您的第一个Node.js Web应用程序已启动并正在运行。 这是很大的,并且会越来越大。
图6.您在纽约!
要停止该应用程序,请在终端窗口中输入Ctrl + C 。 您也可以关闭终端窗口,但是冒着无法正确关闭应用程序的风险,并且该应用程序可能会继续在后台运行(需要更多命令行魔术来终止该进程)。
快速检查练习 :当服务器运行时导航至
localhost:3000
时,您希望发出哪种类型的HTTP请求?
摘要
在本文中,我们安装了Node.js,了解了npm和创建Node.js模块,并且Node.js具有内置功能,可通过http
模块创建Web服务器。 我们通过package.json
文件配置了一个新的Node.js应用程序。 使用http
模块和createServer()
,我们以最小的努力创建了一个Web服务器,这是使用Node.js构建健壮的应用程序的垫脚石,我们可以在终端上运行它。 最后,我们使用的cities
我们的内包装http
服务器通过其邮政编码和响应与该城市名称到用户的浏览器来定位城市。
希望您比本文开始时对学习Node.js更加感兴趣。 如果您想了解更多内容,请下载“ 使用Node.js进行编程”的免费第一章 ,并在Slideshare.net上查看此幻灯片 。 您可以使用代码fccwexler以37%的折扣价在这里购买这本书。
翻译自: https://www.sitepoint.com/build-a-simple-web-server-with-node-js/
构建node.js基础镜像