在这个现代化的Web世界中,Node.js以其轻量级、高效、快速的特性成为了广受欢迎的技术之一。它可以用于后台服务器程序、命令行应用、网络Web服务器等等应用场景。但是,制作出完整的功能强大的Node.js应用确实一件很有挑战性的事情。在大型复杂的应用程序中,我们需要一个框架来帮助我们完成大多数工作,Express.js就是其中一个。
在这篇文章中,我们将会介绍如何使用Express.js搭建一个简单但是实用的Web应用程序。你将会学到如何安装和配置Express.js,如何创建和使用一些基本的中间键,如何连接和使用数据库,以及如何配置项目中的路由和控制器等等。我们将会通过一个小而有趣的示例应用程序,来展示Express.js框架的强大和灵活性。
安装及配置Express.js
在使用Express.js之前,我们需要先安装nodejs环境,并且新创建一个工程文件。为了安装Express.js,我们可以在命令行中输入以下命令:
npm install express --save
这将下载并安装Express.js并保存到我们的项目依赖中,可以在 package.json
文件中看到关于Express.js的具体信息。
在安装之后,我们需要在项目的根目录下创建一个.js
文件,并在其中引入和初始化Express.js。请注意,我们需要同时引入http模块并监听一个端口号以提供页面的访问。
const express = require('express'); const http = require('http'); const port = 3000; const app = express(); http.createServer(app).listen(port, () => { console.log(`Server is listening on port ${port}`); });
现在,你已经成功地初始化了一个Node.js应用程序并使用了Express.js框架。当你运行它时,你会看到在命令行中打印出"Server is listening on port 3000"。
创建和使用中间键
在Express.js中,中间键是非常重要的组件,通过它们我们可以处理HTTP请求,包括路由、身份验证、错误处理等。在本例中,我们将使用中间键来解析我们的请求体,并设置一个静态文件目录,以便可以正确地访问我们的CSS和JavaScript文件。
app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, 'public')));
在这里,我们加载了三个中间键,第一个中间键解析了请求体,并将body属性添加到Express.js的请求对象中;第二个中间键处理了urlencoded格式的请求,以便于在处理POST请求时处理页面上的表单数据;第三个中间键确保我们的CSS和JavaScript文件可以正确地访问,它需要一个路径来指向静态文件目录。
连接和使用数据库
下一步,我们需要配置连接到数据库并操作数据的模块。在这个示例中,我们将连接到一个MongoDB数据库并使用Mongoose.js进行数据管理。
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/express-app', { useNewUrlParser: true, useUnifiedTopology: true });
在这里,我们通过mongoose.connect()将Node.js连接到我们的MongoDB数据库。Express.js与MongoDB的接口在mongoose.js中实现,它使得我们能够进行数据库写入、查询和获得数据的操作。它也提供了一个易于使用和可定制的Schema和Model来管理我们的数据。
配置路由和控制器
现在,我们已经完成了所有必要的基础设施设置,开始处理路由和控制器。我们的应用程序将包含以下两个路由:
- 用户登录
- 一些文本内容的页面
为了实现这些路由,我们需要做到以下两步:
设置我们的路由
const indexRouter = require('./routes/index'); const loginRouter = require('./routes/login'); app.use('/', indexRouter); app.use('/login', loginRouter);
在这里,我们设置了两个路由:index.js
和login.js
。他们分别返回主要的应用程序页面和登录页面,并路由到兴趣相关的路径。为此,我们调用express.Router()
创建express路由对象。路由器实际上是中间键函数,它自己是在“middleware”堆栈中注册的。
设置Controler
const indexController = require('./controllers/index'); const loginController = require('./controllers/login'); app.use('/login', loginController); app.use('/', indexController);
我们在这里对路由进行处理和响应,使用我们的控制器。控制器负责接收和处理请求数据,以及生成响应数据给客户端的操作。在这个示例中,我们将通过控制器的两种类型来实现路由:index.js
和login.js
。他们调用不同的视图文件,并使用不同的中间键来处理不同的页面请求。
这是我们的路由处理的范例
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ----------------- --------------- ----- ---- -- - ------------------- - ------ ------ ----- --- --- -------------------- ----- ---- -- - ------------------- - ------ ------ ----- --- --- -------------- - -------
在这里,我们定义了一个使用Express.js的路由器,它将路由请求到一个视图文件中。在我们的这个示例中,该路由器返回了两个视图文件,分别是index.ejs
和about.ejs
。也就是说,我们将使用EJS作为我们的View Engine。在reder方法中,我们将渲染title变量作为传递给视图文件的数据。
控制器范例
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ----------------- --------------- ----- ---- -- - ------------------- - ------ ------ ----- --- --- ---------------- ----- ---- -- - ----- - --------- -------- - - --------- -- --------- -- --------- - -- --------- --- ------- -- -------- --- -------- - ------------------ - ---- - ------------------- - ------ ------ ------ ------------- -------- -------- -- ---------- --- - - ---- - ------------------- - ------ ------ ------ ------------- --------- -- -------- ------ -- ------- --- - --- -------------- - -------
在这里,我们定义了一个loginController
,它负责处理用户登录操作。当用户点击登录按钮时,该控制器将接收和处理POST请求数据,并根据输入的用户名和密码进行身份验证。如果成功,则重定向到我们的主页,否则将返回一个带有错误消息的登录页。
关于视图引擎
Express默认情况下支持多种View Engine,包括EJS、Pug和Handlebars等等。在这个示例中,我们选择了EJS呈现引擎。EJS是一款简单易用的模板引擎,主要由四部分组成:文本字符串、JavaScript代码、注释和嵌入式JavaScript函数。EJS非常适合大多数中小型项目,因为它提供了足够的灵活性和功能,同时又不过于复杂。
结论
这里是一个使用Express.js搭建的一个小的Web应用程序的概述。我们实现了许多不同的功能,包括路由、控制器、中间键、MongoDB和使用视图引擎。但是,Express.js可以做比这更多的事情,它提供了许多扩展和插件,因此可以适应多种应用程序开发需求。
如果你想开始使用Express.js进行开发,那么推荐你去尝试使用一些简单一点的小应用程序,从而了解该框架的基本功能。去试试使用websocket,swig等等来提高自己的NodeJS编程能力。欢迎你探索Express.js的其他功能,如果你在开发过程中有别的问题或疑问,可以通过Stack Overflow或官方文档寻找帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673801db317fbffedf0daa2a