express新手入门指南,3个月学会前端开发

// 自定义逻辑

next();

}

三个参数中,req 和 res 就是前面提到的 Request 请求对象和 Response 响应对象;而 next 函数则用来触发下一个中间件的执行。

注意

如果忘记在中间件中调用 next 函数,并且又不直接返回响应时,服务器会直接卡在这个中间件不会继续执行下去哦!

在 Express 使用中间件有两种方式:全局中间件路由中间件

全局中间件

通过 app.use 函数就可以注册中间件,并且此中间件会在用户发起任何请求都可能会执行,例如:

app.use(someMiddleware);

路由中间件

通过在路由定义时注册中间件,此中间件只会在用户访问该路由对应的 URI 时执行,例如:

app.get(‘/middleware’, someMiddleware, (req, res) => {

res.send(‘Hello World’);

});

那么用户只有在访问 /middleware 时,定义的 someMiddleware 中间件才会被触发,访问其他路径时不会触发。

编写中间件

接下来我们就开始实现第一个 Express 中间件。功能很简单,就是在终端打印客户端的访问时间、 HTTP 请求方法和 URI,名为 loggingMiddleware。代码如下:

// …

const app = express();

function loggingMiddleware(req, res, next) {

const time = new Date();

console.log([${time.toLocaleString()}] ${req.method} ${req.url});

next();

}

app.use(loggingMiddleware);

app.get(‘/’, (req, res) => {

res.send(‘Hello World’);

});

// …

注意

在中间件中写 console.log 语句是比较糟糕的做法,因为 console.log(包括其他同步的代码)都会阻塞 Node.js 的异步事件循环,降低服务器的吞吐率。在实际生产中,推荐使用第三方优秀的日志中间件,例如 morgan[8]、winston[9] 等等。

运行服务器,然后用浏览器尝试访问各个路径。这里我访问了首页(localhost:3000)和 /hello(localhost:3000/hello,浏览器应该看到的是 404),可以看到控制台相应的输出:

[11/28/2019, 3:54:05 PM] GET /

[11/28/2019, 3:54:11 PM] GET /hello

这里为了让你初步理解中间件的概念,我们只实现了一个功能很简单的中间件。实际上,中间件不仅可以读取 req 对象上的各个属性,还可以添加新的属性或修改已有的属性(后面的中间件和路由函数都可以获取),能够很方便地实现一些复杂的业务逻辑(例如用户鉴权)。

用模板引擎渲染页面


最后,我们的网站要开始展示一些实际内容了。Express 对当今主流的模板引擎(例如 Pug、Handlebars、EJS 等等)提供了很好的支持,可以做到两行代码接入。

提示

如果你不了解模板引擎,不用担心,这篇教程几乎不需要用到它的高级功能,你只需理解成一个“升级版的 HTML 文档”即可。

这篇教程将使用 Handlebars[10] 作为模板引擎。首先添加 npm 包:

npm install hbs

创建 views 文件夹,用于放置所有的模板。然后在其中创建首页模板 index.hbs,代码如下:

个人简历

我是一只小小的图雀,渴望学习技术,磨炼实战本领。

联系方式

创建联系页面模板 contact.hbs,代码如下:

联系方式

QQ:1234567

微信:一只图雀

邮箱:mrc@tuture.co

最后便是在 server.js 中配置和使用模板。配置模板的代码非常简单:

// 指定模板存放目录

app.set(‘views’, ‘/path/to/templates’);

// 指定模板引擎为 Handlebars

app.set(‘view engine’, ‘hbs’);

在使用模板时,只需在路由函数中调用 res.render 方法即可:

// 渲染名称为 hello.hbs 的模板

res.render(‘hello’);

修改后的 server.js 代码如下:

// …

const app = express();

app.set(‘views’, ‘views’);

app.set(‘view engine’, ‘hbs’);

// 定义和使用 loggingMiddleware 中间件 …

app.get(‘/’, (req, res) => {

res.render(‘index’);

});

app.get(‘/contact’, (req, res) => {

res.render(‘contact’);

})

// …

注意在上面的代码中,我们添加了 GET /contact 的路由定义。

最后,我们再次运行服务器,访问我们的主页,可以看到:

点击”联系方式“,跳转到相应页面:

添加静态文件服务


通常网站需要提供静态文件服务,例如图片、CSS 文件、JS 文件等等,而 Express 已经自带了静态文件服务中间件 express.static,使用起来非常方便。

例如,我们添加静态文件中间件如下,并指定静态资源根目录为 public

// …

app.use(express.static(‘public’));

app.get(‘/’, (req, res) => {

res.render(‘index’);

});

// …

假设项目的 public 目录里面有这些静态文件:

public

├── css

│ └── style.css

└── img

└── tuture-logo.png

就可以分别通过以下路径访问:

http://localhost:3000/css/style.css

http://localhost:3000/img/tuture-logo.png

样式文件 public/css/style.css 的代码如下(直接复制粘贴即可):

body {

text-align: center;

}

h1 {

color: blue;

}

img {

border: 1px dashed grey;

}

a {

color: blueviolet;

}

图片文件可通过这个 GitHub 上的链接[11]下载,然后下载到 public/img 目录中。当然,你也可以使用自己的图片,记得在模板中替换相应的链接就可以了。

在首页模板 views/index.hbs 中加入 CSS 样式表和图片:

个人简历

Logo

我是一只小小的图雀,渴望学习技术,磨炼实战本领。

联系方式

在联系模板 views/contact.hbs 中加入样式表:

联系方式

QQ:1234567

微信:一只图雀

邮箱:mrc@tuture.co

再次运行服务器,并访问我们的网站。首页如下:

联系我们页面如下:

可以看到样式表和图片都成功加载出来了!

处理 404 和服务器错误


人有悲欢离合,月有阴晴圆缺,服务器也有出错的时候。HTTP 错误一般分为两大类:

•客户端方面的错误(状态码 4xx),例如访问了不存在的页面(404)、权限不够(403)等等•服务器方面的错误(状态码 5xx),例如服务器内部出现错误(500)或网关错误(503)等等

如果你打开服务器,访问一个不存在的路径,例如 localhost:3000/what,就会出现这样的页面:

很显然,这样的用户体验是很糟糕的。

在这一节中,我们将讲解如何在 Express 框架中处理 404(页面不存在)及 500(服务器内部错误)。在此之前,我们要完善一下 Express 中间件的运作流程,如下图所示:

这张示意图和之前的图有两点重大区别:

•每个路由定义本质上是一个中间件(更准确地说是一个中间件容器,可包含多个中间件),当 URI 匹配成功时直接返回响应,匹配失败时继续执行下一个路由•每个中间件(包括路由)不仅可以调用 next 函数向下传递、直接返回响应,还可以抛出异常

从这张图就可以很清晰地看出怎么实现 404 和服务器错误的处理了:

•对于 404,只需在所有路由之后再加一个中间件,用来接收所有路由均匹配失败的请求•对于错误处理,前面所有中间件抛出异常时都会进入错误处理函数,可以使用 Express 自带的,也可以自定义。

处理 404

在 Express 中,可以通过中间件的方式处理访问不存在的路径:

app.use(‘*’, (req, res) => {

// …

});

* 表示匹配任何路径。将此中间件放在所有路由后面,即可捕获所有访问路径均匹配失败的请求。

处理内部错误

Express 已经自带了错误处理机制,我们先来体验一下。在 server.js 中添加下面这条”坏掉“的路由(模拟现实中出错的情形):

app.get(‘/broken’, (req, res) => {

throw new Error(‘Broken!’);

});

然后开启服务器,访问 localhost:3000/broken

危险!

服务器直接返回了出错的调用栈!很明显,向用户返回这样的调用栈不仅体验糟糕,而且大大增加了被攻击的风险。

实际上,Express 的默认错误处理机制可以通过设置 NODE_ENV 来进行切换。我们将其设置为生产环境 production,再开启服务器。如果你在 Linux、macOS 或 Windows 下的 Git Bash 环境中,可以运行以下命令:

NODE_ENV=production node server.js

如果你在 Windows 下的命令行,运行以下命令:

set NODE_ENV=production

node server.js

这时候访问 localhost:3000/broken 就会直接返回 Internal Server Error(服务器内部错误),不会显示任何错误信息:

体验还是很不好,更理想的情况是能够返回一个友好的自定义页面。这可以通过 Express 的自定义错误处理函数来解决,错误处理函数的形式如下:

function (err, req, res, next) {

// 处理错误逻辑

}

和普通的中间件函数相比,多了第一个参数,也就是 err 异常对象。

实现自定义处理逻辑

通过上面的讲解,实现自定义的 404 和错误处理逻辑也就非常简单了。在 server.js 所有路由的后面添加如下代码:

// 中间件和其他路由 …

app.use(‘*’, (req, res) => {

res.status(404).render(‘404’, { url: req.originalUrl });

});

app.use((err, req, res, next) => {

console.error(err.stack);

res.status(500).render(‘500’);

});

app.listen(port, () => {

console.log(Server running at http://${hostname}:${port}/);

});

提示

在编写处理 404 的逻辑时,我们用到了模板引擎中的变量插值功能。具体而言,在 res.render 方法中将需要传给模板的数据作为第二个参数(例如这里的 { url: req.originalUrl } 传入了用户访问的路径),在模板中就可以通过 {{ url }} 获取数据了。

404 和 500 的模板代码分别如下:

找不到你要的页面了!

你所访问的路径 {{ url }} 不存在

服务器好像开小差了

过一会儿再试试看吧!See your later~

再次运行服务器,访问一个不存在的路径:

访问 localhost:3000/broken

体验很不错!

三行代码实现 JSON API

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

总结

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

2944)]
[外链图片转存中…(img-6kke7XJu-1712141962944)]
[外链图片转存中…(img-BgVtnVr9-1712141962945)]
[外链图片转存中…(img-6mDFkaXO-1712141962945)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-fbIZDogr-1712141962945)]

总结

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-RTj0sISM-1712141962946)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值