• 作者:老汪软件技巧
  • 发表时间:2024-09-17 07:02
  • 浏览量:

前言

这篇文章的诞生源于我之前的一个经历,我有一个比较好的点子,想把它实现出来,但是无奈自己只能写前端的部分,后端的接口却无从下手,学习JAVA、Go等周期又太长了;后面了解到了这个框架,对前端来说上手很自然,通过和MongoDB数据库结合解决了我的后端需要;所以写这篇express入门的文章也是为了解决和我之前遇到同样问题的朋友。

介绍

首先这里是它的官网(点不开就进这个中文网站)

Express是一个基于Node.js平台,快速、开放、极简的Web开发框架:

基本使用

开始之前,请先在一个文件夹中,使用npm init初始化项目,下载express包,后续的操作都在这个文件夹中进行

Web服务

新建一个index.js作为主文件

// 引入express
const express = require('express');
// 执行express
const app = express();
// 编写接口
app.get('/', (req, res, next) => {
  // res.write('111');
  // res.end();
  // res.send = res.write+res.end
  // res.send('111');
  res.send(`
      
          

111

`
); }); // 监听3000端口 app.listen(3000, () => { console.log('server start'); });

node index.js执行上面文件,那么在:3000/根目录就能够看到页面内容:(此处将以上文件定义为入口文件)

这里要讲一下,上方代码中的API

listen:监听端口路由

经过上面的操作之后,页面内容显示了出来,但是只有一个页面,挺单调的;这里使用express.Router来增加一个home页面.

在根目录新建router文件夹,然后在文件夹中新建js文件,命名为HomeRouter,写入以下内容:

const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
  res.send('home 页面内容');
});
module.exports = router;

在入口文件引入它:

const HomeRouter = require('./router/HomeRouter');
...
app.use('/home', HomeRouter);
...

重新运行之后,访问/home,就能看到如下内容:

除了显示页面内容,也可以在router中定义接口内容,比如这里我们在上面的HomeRouter文件中加入一个get接口:

router.get('/data', (req, res) => {
  res.send([1, 2, 3]);
});

这时候访问/home/data,就有以下效果:

也就是说,router的功能既可以定义返回页面内容的接口,也可以定义返回数据的接口。

后续若是你真正的使用,可能会有userRouter、LoginRouter等等代表不同的接口,这时候router文件夹就起到了集中统一管理的作用:

模版

到了这一步,你可能对于上面的直接返回页面内容有了疑问:以后复杂的页面不可能都用这种方式返回页面内容吧?

是的,你的感觉是对的,肯定不可能这样使用;所以接下来,就要引出EJS模版这个概念了。

EJS是一个用于Web开发的JavaScript模板引擎,允许用户使用HTML模板中的JavaScript代码生成动态HTML标记。

接下来,我们将上方的例子改造一下:

在这里先引入ejs包:

npm install ejs

在根目录创建文件夹views统一管理页面,在文件夹中创建两个文件:home.ejs、login.ejs

// home.ejs
html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Documenttitle>
  head>
  <body>
    // 语法 <%= 值%>
    home 传入的值 <%= data%>
  body>
html>

// login.ejs
html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Documenttitle>
  head>
  <body>
    login-html
    // 语法 <%= 值%>
    <h1>传入的值:<%=title%>h1>
    <form action="/login" method="post">
      <div>用户名:<input type="text" name="username" />div>
      <div>密码:<input type="password" name="password" />div>
      <div><input type="submit" value="登录" />div>
    form>
  body>
html>

修改HomeRouter,新增LoginRouter

// HomeRouter
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
  // 渲染模版,并给模版传参
  res.render('home', {data: 222}); // 找views文件夹下的home.ejs
});
module.exports = router;

// LoginRouter
const express = require('express');
const router = express.Router();
// 路由级别-响应前端的给请求
router.get('/', (req, res) => {
  console.log(req.query, 'req');
  // res.send('login根');
  // 渲染模版,并给模版传参
  res.render('login', {title: 222}); // 找views文件夹下的login.ejs
});
// 路由级别-响应前端的post请求
router.post('/', (req, res) => {
  res.redirect('/home');
});
module.exports = router;

入口文件修改为如下内容:

const express = require('express');
const LoginRouter = require('./router/LoginRouter');
const HomeRouter = require('./router/HomeRouter');
const app = express();
// 配置模版引擎
app.set('views', './views');
app.set('view engine', 'ejs');
app.use('/login', LoginRouter);
app.use('/home', HomeRouter);
app.listen(3000, () => {
  console.log('启动');
});

经过以上修改之后,访问/home就是home.ejs的内容,访问/login就是login.ejs的内容:

ok,效果出来了,梳理一下模版使用的知识点,如下:

express使用ejs的步骤:

路由传参

经过上面的例子,能够做到显示不同的页面了;在login页面中,可以看到留了一个登录表单,LoginRouter也预留了一个post请求。没错,这一节要来讲一下路由传参(body、query)了,正好从获取post参数开始讲。

配置解析请求体,在入口文件加入以下内容:

// 配置解析body参数(4.16.0 及以上的版本)
app.use(express.urlencoded({extended: false}));
app.use(express.json()); // json格式

在LoginRouter中的post接口中,添加一行代码:

console.log(req.body);

重新运行,输入帐号、密码,点击登录,在终端即可看到以下内容:

[Object: null prototype] { username: '111', password: '222' }

ok,获取query参数就更简单了,不用配置,直接res.query就可以查看内容;在HomeRouter中添加一行代码:

console.log(req.query);

重新运行之后,访问这个地址:3000/home?abc=111

终端就会出现以下内容:

{ abc: '111' }

那么,总结一下:

中间件

在 Express 中,中间件(Middleware)是函数,用于处理请求和响应对象。在请求-响应周期中,中间件可以访问请求对象 (req)、响应对象 (res),以及下一个中间件函数,通过调用 next() 来传递控制权。

中间件主要有以下几种类型:

中间件主要是用来处理一些系统层面的事情,例如登录校验、统一错误处理等等。

在主入口文件的头部位置,加入以下代码:

app.use((req, res, next) => {
  console.log('应用级中间件');
  next();
});
// 加了路径代表只有这个路径才执行
app.use('/home', (req, res, next) => {
  console.log('路由级中间件');
  next();
});

现在访问接口的时候,应用级中间件会触发,访问/home的时候会同时触发应用级中间件和路由级中间件:

应用级中间件
路由级中间件

总结:中间件是express的核心概念,能够处理一些系统层面的工作,然后将控制权交出去。

静态资源

express提供了express.static的方式来配置静态文件,例如:

app.use(express.static('public'));

访问的时候,不需要public,只需要localhost:3000/文件名,就能够访问到。

总结

到这里的话,express的基本概念就讲解完毕了,文中带着你写了访问页面的接口、返回数据的接口、请求参数获取、路由分块等等功能;

你可以用它来写前后端一体的项目,也可以按标题说的作为一个后端来给你自己提供接口,写一点自己的东西。如果你有数据库需要的话,express也可以和MongoDB结合(有MongoDB的需要,推荐一下这一篇《入门MongoDB,看这一篇文章就够了》);如果你有登录校验的需要,还可以JWT与express结合。

总之express能做的事情还是很多的,是一个挺不错的框架,如果你对它的底层原理感兴趣的话,可以去研究一下Node.js的http模块。