资讯专栏INFORMATION COLUMN

Express 实战(二):Node.js 基础

soasme / 1319人阅读

摘要:而通过实现名为的标准模块,完美的解决了模块导入问题。通常都被称为包管理器,而这也是它最大的特色。例如,接受请求发送响应。该模块主要处理文件相关内容,其中大多数都是文件读写功能。

在上一篇文章中,我们简单的介绍了 Node.js 。了解到它基于 JavaScript、天生异步、拥有大量的第三方类库。本文将会在之前的基础上,对 Node.js 进行更深入的介绍。其中主要内容包括:

Node 的安装

如何使用第三方模块生态

第三方模块的安装

一些简单的使用示例

开发过程中的一些建议和技巧

在此之前,我假设你已经掌握了 JavaScript 基础知识并且熟悉一些基本的命令行操作。另外,不要臆想通过这一章就全面掌握 Node。但是如果你有心的话,可以去阅读 Node.js 实战

安装Node

JavaScript 世界的一大特点就是它选择性非常多,Node 的安装也不例外。

可以在官方下载页面找到各种版本的源代码和安装包文件。建议你使用与自己操作系统对应的安装包进行安装。当然,你也可用使用 apt-get、Homebrew 等包管理器进行安装,如果你系统有的话。具体详见官方的包管理工具的安装指南。

如果你使用的是 Mac 或者 Linux 的话,那么我极力推荐你使用 NVM 来安装。Window 系统上的对应程序是 NVMW。这些版本管理工具,让你可以在不同版本间进行自由切换。例如,你可以在尝试新版本的特性时,同时在系统中保留一份稳定版。另外,NVM 无需系统管理权限同时卸载也非常容易。而安装过程也只需在终端执行一行命令。

现在,请在你系统中安装好 Node。

运行你的第一个Node脚本

安装完成后,先动手写个 "Hello World" 来检验一些。在新建的 helloworld.js 中加入一下代码:

console.log("Hello, World!");

代码中主要就是使用 console.log 来打印字符串 "Hello,world!",相信对于前端程序员来说并不会感到陌生。下面我们使用 node helloworld.js 运行代码。如果一切正常的话,会出现如下输出:

模块的使用

在大多数编程语言中,我们都会对代码进行拆分,然后在使用的时候将这些文件引入其中。例如,C 和 C++ 中的 include,Python 的 import ,Ruby 和 PHP 中的 require。而另外一些语言,如 C# 是在编译时完成跨文件引用的。

很长一段时间内,JavaScript 官方并不支持模块机制。所以社区中有人就编写了 RequireJS 这种工具来解决依赖项导入的问题。但是,大多数时候还是通过

Node 的异步工作原理与此类似,例如,你通过浏览器请求 Node 服务器上的一张小猫图片。因为该图片资源太大,所以在进行磁盘读写的时候你可以抽身去处理其他事情。此时,这个磁盘就相当于一个外部资源,我们可以直接处理第二个请求而无需挂起等待费时操作结束。

Express 中主要有两个外部资源:

涉及文件系统。例如,磁盘文件的读写。

涉及网络处理。例如,接受请求、发送响应。

在 Node 代码中,这些异步都是通过回调进行处理的。其工作原理和在 Web 页面发送 AJAX 请求一样。在发送请求时你会附带一个回调函数,当请求处理完成后你的回调将会被执行。

例如,现在你正在硬盘上读取文件 myfile.txt 。当读取结束后,你希望能够打印出其中字母 X 出现的次数,代码如下:

var fs = require("fs");  
 
var options = { encoding: "utf-8" };                      
fs.readFile("myfile.txt", options, function(err, data) {  
  if (err) {                                
    console.error("Error reading file!");   
    return;                                 
  }                                        
 
  console.log(data.match(/x/gi).length + " letter X"s");  
});

下面我们一步步解释这些代码:

首先,我们导入 Node 自带的文件系统模块。该模块主要处理文件相关内容,其中大多数都是文件读写功能。本例使用的其中的 readFile 方法。

接下来,我们需要设置 fs.readFile 方法中的参数,第一个是文件名,第二个就是会回调函数。并且在读取结束后执行回调函数。

在 Node 中大多数回调函数都会设置错误信息 error 作为第一个参数。正常情况下该参数等于 null ,如果出现错误则该参数会保存错误信息。虽然有时候这些错误信息并不会导致程序终止执行,但是多数情形下我们都需要对错误做出响应,例如,抛出异常并跳出回调函数。这也是 Node 中最常见的回调实践。

最后,当一切正常时我们使用正则表达式匹配字母 X 并打印其数量。

下面我们就来做个测试。这里,我们在上面代码的结束加上一段,那么会发生什么事情呢?

var fs = require("fs");  
 
var options = { encoding: "utf-8" };                      
fs.readFile("myfile.txt", options, function(err, data) {  
  if (err) {                                
    console.error("Error reading file!");   
    return;                                 
  }                                        
 
  console.log(data.match(/x/gi).length + " letter X"s");  
});

console.log("Hello World!");

异步文件读取时异步操作,所以这里先打印出来的是 " Hello world! ",然后才是异步函数中的打印操作。

这就是异步模式强大的地方。当一个外部设备在处理费时操作时,你可以继续运行其他代码。在 Web 应用中这意味着相同的时间可以处理更多的请求。

注意:如果你想了解更多 JavaScript 异步的内容的话,你可以去油管上查看这个视频。视频中的讲解同时适用于 Node 和浏览器环境。

用 Node 构建 Web 服务:http 模块

只有理解了上面那些概念,你才能更好的掌握 Node 内置的 HTTP 模块。而该模块对 Express 框架来说又是最重要的模块之一。Node 和 Express 能够构建 Web 服务正是依赖于这个模块中的功能。

Node 的 HTTP 模块有很多特性(比如,向其他服务器发送网络请求),不过我们将要使用的是其中一个名为 http.createServer 的方法。该方法通过其回调函数来处理每一次的网络请求,并且进行响应。下面代码中我们将所有的响应都设置为了 "hello world" (可以保存到 myserver.js 中)。

var http = require("http");           
 
function requestHandler(request, response) {             
  console.log("In comes a request to: " + request.url);  
  response.end("Hello, world!");                         
}                                                        
 
var server = http.createServer(requestHandler);  
server.listen(3000);  

上面的代码由 4 个部分构成。

首先,我们引入 HTTP 模块并将其保存到变量 http 中。这与之前 URL 模块的操作一致。

接着,定义了一个请求处理函数 requestHandler 。教程中的几乎所有的代码要么是请求处理函数要么是调用处理函数。该函数有两个参数,request 表示请求对象,而 response 则表示响应对象。request 中包含 URL 路径、user-agent 等信息。而通过调用 response 对象方法 Node 会将响应信息打包好并发送给请求者。

余下的代码则是指定内置的 HTTP 服务在请求是执行的处理函数以及服务监听的端口号。

对于 HTTPS 来说,我们则可以使用自带的 HTTPS 模块。除了需要配置 SSL 证书,其余的过程都一样。如果你了解 HTTPS 的话那么后期从 HTTP 切换到 HTTPS 两分钟就能搞定。即使你不了解,也不必太过担心。

如果你将代码保存到 myserver.js 并执行 node myserver.js 拉起服务。那么,此时你在浏览器中访问 http://localhost:3000 ,你就会看到:

你可能也注意到了,每当你发起请求的时候终端控制台都会打印一些信息。当你尝试访问不同 URL 时,虽然控制台打印的信息不同但是得到的响应却都是 “Hello, world!”。控制台打印的信息类似于:

请注意上面打印的 URL 信息中并不包含 localhost:3000。虽然看起来显得不那么直观,但是反过来这也是对的。毕竟使用相对路径,我们无需修改就能在任何电脑上部署 Node 应用。

而 URL 解析的代码大致如下:

function requestHandler(req, res) {
    if (req.url === "/") {
        res.end("Welcome to the homepage!");
    } else if (req.url === "/about") {
        res.end("Welcome to the about page!");
    } else {
        res.end("Error! File not found.");
    }
}

所有的请求 URL 都可以在这个函数里面完成处理。这样做对于简单的应用来说确实非常简单,但是当应用规模变大之后该函数就会变的臃肿不利于维护。这也是 Express 框架出现的重要原因。

总结

本文主要内容:

Node 的安装

模块系统的使用

package.json 文件的介绍

通过 package.json 安装第三放模块依赖项

Node 中的异步编程概念。

简单 HTTP 服务应用的创建。

原文地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84827.html

相关文章

  • 大前端2018现在上车还还得及么

    摘要:面向对象三大特征继承性多态性封装性接口。第五阶段封装一个属于自己的框架框架封装基础事件流冒泡捕获事件对象事件框架选择框架。核心模块和对象全局对象,,,事件驱动,事件发射器加密解密,路径操作,序列化和反序列化文件流操作服务端与客户端。 第一阶段: HTML+CSS:HTML进阶、CSS进阶、div+css布局、HTML+css整站开发、 JavaScript基础:Js基础教程、js内置对...

    stormgens 评论0 收藏0
  • 大前端2018现在上车还还得及么

    摘要:面向对象三大特征继承性多态性封装性接口。第五阶段封装一个属于自己的框架框架封装基础事件流冒泡捕获事件对象事件框架选择框架。核心模块和对象全局对象,,,事件驱动,事件发射器加密解密,路径操作,序列化和反序列化文件流操作服务端与客户端。 第一阶段: HTML+CSS:HTML进阶、CSS进阶、div+css布局、HTML+css整站开发、 JavaScript基础:Js基础教程、js内置对...

    mylxsw 评论0 收藏0
  • NodeJs+Express+Mysql + Vuejs 项目实战 - 大纲

    摘要:多一个技能多一条出路,祝你在自学道路上越走越好,掌握自己的核心技能,不只是优秀,还要成为不可替代的人 NodeJs+Express+Mysql + Vuejs 项目实战 最近准备写一系列文章,全面讲述如何基于NodeJs + Express + Mysql + Vuejs 从零开发前后端完全分离项目; 文笔及技术可能在某些方面欠佳,请您指正,共同学习进步 前端:Vuejs全家桶 后端:...

    noONE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<