node.js express框架开发入门教程

news2024/11/16 13:27:52

文章目录

  • 前言
  • 一、Express 生成器(express-generator)
  • 二、快速安装
    • 1.express框架+express-generator生成器安装
    • 2.使用pug视图引擎创建项目,projectName 为项目名称自定义
  • 三、安装热更新插件 nodemon
  • 四、目录结构
      • 1. public文件夹
      • 2.routes路由
        • 其他请求方式:
        • 入参
      • 3. view 模版引擎
      • 4.app.js
  • 五、app.js内部代码解读


前言

node.js express框架开发入门教程,包括express-generator生成器、nodemon、基础路由、中间件、模版引擎介绍、app.js解读等


一、Express 生成器(express-generator)

使用express-generator,能快速创建应用程序骨架,类似vue脚手架帮我们搭建项目结构,并在基础上进行开发调试运行。

二、快速安装

1.express框架+express-generator生成器安装

npm install express express-generator -g

需要注意express必须全局-g安装才能识别后面的express命令

2.使用pug视图引擎创建项目,projectName 为项目名称自定义

express projectName  --view=pug

也可以使用其他模版引擎例如jade、mustache、dust、ejs等,不加--view=pug默认jade引擎,官方已弃用,现在推荐用pug。

模版引擎主要用来服务端渲染HTML,在运行时,模板引擎将模板文件中的变量替换为实际值,并将模板转换为发送给客户端的 HTML 文件

cd projectName  

加载依赖

npm install

启动项目

npm start

端口号默认3000,浏览器输入http://localhost:3000出现如下界面即可表示项目启动成功

!](https://img-blog.csdnimg.cn/direct/7723770d79a64698a14dddd59a203db9.png)

三、安装热更新插件 nodemon

生成器默认修改代码保存后不更新需要安装nodemon插件来支持热更新

安装插件

npm install nodemon --save

修改启动配置
package.json:

  "scripts": {
    "start": "nodemon ./bin/www"
  },

重新 npm start 启动生效

四、目录结构

├── app.js  ---初始化入口
├── bin   
│   └── www  ---运行文件
├── package.json ---配置
├── public   ---静态资源
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes  ---路由
│   ├── index.js
│   └── users.js
└── views  ---模版引擎,生成html页面
    ├── error.pug
    ├── index.pug
    └── layout.pug

1. public文件夹

public 静态资源文件夹,放置图片、js脚本或css资源文件等,在app.js通过设置

app.use(express.static(path.join(__dirname, 'public')));

可以直接访问服务器静态资源,例如:http://localhost:3000/images/a.jpg
在这里插入图片描述
可以自定义路径前缀

app.use('/static',express.static(path.join(__dirname, 'public')));

访问地址变为

http://localhost:3000/static/images/a.jpg

需要注意的express.static 内置中间件函数需要在路由设置前面执行才能生效

2.routes路由

routes文件夹放置所有路由文件,并在app.js引入。项目默认内置routers/index.js、routers/user.js2个路由文件,可按 需添加例如, 新建demo.js文件
在这里插入图片描述

写入

var express = require('express');
var router = express.Router();

//get请求
router.get('/login', function(req, res, next) {
  res.send('login')
});

//post请求
router.post('/login', function(req, res, next) {
  res.send({
     code:200,
     msg:'success'
  })
});

module.exports = router;

通过app.use(url,router)在app.js引入使用

app.use('/demo',demoRouter)

访问:http://localhost:3000/demo/login

在这里插入图片描述

其他请求方式:
router.post(),
router.put(),
router.delete()
router.all()

router.all()将匹配所有的请求方式,例如定义了router.all(‘/login’,(req,res,next)=>{}),
客户端不管是用get或者post或put请求/login接口都将匹配all执行相应响应逻辑

入参
function(req, res, next){
}

req:请求对象/请求体

常见属性:
       req.query:get请求参数  /login?name=xl&age=20
       req.body:post请求参数 {name:xl,age20}
       req.params: 匹配动态路由参数 /login/:id
       req.method: 请求方式
       req.url :请求路由
       req.get 获取指定的请求头字段   req.get('content-type')

res:响应对象/响应体

常见属性:
       res.set:设置响应头字段  res.set('Content-Type', 'text/plain')
       res.status 设置响应状态码 res.status(403)
       res.json 向客户端发送json数据类型  res.json({data:true})
       res.send 向客户端发送任何数据类型
       res.sendFile 向客户端发送文件 res.sendFile(path [, options] [, fn])
       res.render view模版文件 HTML 字符串发送到客户端 res.render(view [, locals] [, callback])

next:进入下个中间件回调,没有执行任何响应(res.sendxxxx或res.json)且没调用next(),请求将被挂起。调用了next(),代码将进入下一个中间件

3. view 模版引擎

模版引擎作用是通过模版语法把代码转换为html字符串返回给客户端渲染出html页面

在app.js可以看到如下代码:

var indexRouter = require('./routes/index');
.....
.....
app.set('views', path.join(__dirname, 'views'));//设置模版引擎文件夹
app.set('view engine', 'pug');//设置pug为模版引擎
.....
......
app.use('/', indexRouter);

指定了模版文件夹views和使用pug作为引擎,当浏览器访问http://localhost:3000,匹配路由/加载
routes/index.js:

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

通过res.render返回views/index.pug 模版给客户端渲染,传入动态值title=‘Express’

views/index.pug代码如下 :

extends layout

block content
  h1= title
  p Welcome to #{title}

extends layout继承了views/layout.pug 模版内容

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content

并在body添加了h1标签内容为title,p标签内容为Welcome to #{title}
转换为html就是

<h1>Express</h1>
<p>Welcome to Express</p>

浏览器访问http://localhost:3000将显示如下界面:
在这里插入图片描述
至于模版引擎语法对应查看相应官方文档

4.app.js

app.js为项目入口文件,初始化执行。

var app = express();

通过express()生成实例

app实例常用方法:

1.app.set(name,value)
将设置 name 分配给 value ,例如

app.set('views', path.join(__dirname, 'views'));// 设置模版文件夹
app.set('view engine', 'pug');//  设置模版引擎

2.app.use([path,] callback [, callback…])
在指定路径挂载指定的中间件函数或函数:当请求路径的基数与 path 匹配时执行中间件函数。

app.use((req, res, next) => {
  console.log('Time: %d', Date.now())
  next()
})

3.app.listen(path, [callback])
绑定并监听指定主机和端口上的连接。此方法与 Node 的 http.Server.listen() 相同

app.listen(3000,()=>{
  console.log('访问地址http://localhost:3000')
})

express常见方法:

方法描述
express.json使用 JSON 有效负载解析传入请求,并且基于 body-parser
express.static提供静态文件
express.Router创建一个新的 router 对象
express.urlencoded使用 urlencoded 有效负载解析传入的请求,并且基于 body-parser。

例如:
1、设置解析请求传参编码格式为’content-type’:‘application/json’

var app = express();
app.use(express.json());//请求参数为json格式,通过res.body能获取到参数,如果不设置将获取到undefined

2、设置解析请求传参编码格式为’ application/x-www-form-urlencoded’

var app = express();
app.use(express.urlencoded({ extended: false }));//请求参数为query参数?a=1&b=2

extended设置false和true区别为:
false:采用querystring库解析参数,value是string类型无法解析嵌套多层
true:采用qs库解析参数,value是任意数据类型可以解析嵌套多层

3.设置静态文件

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

4.使用路由

var router = express.Router();
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

ps:1-3点都必须在使用路由前调用才会生效,也即中间件需要在路由匹配前使用,因为一旦路由路径匹配到如果不调用next(),直接给客户端作出响应后面代码就不执行了

五、app.js内部代码解读

//引入第三方模块
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

//引入路由文件模块
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

//生成express实例
var app = express();

// 设置模版引擎目录,指定模版引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));//使用运行日志中间件
app.use(express.json());//解析json格式参数
app.use(express.urlencoded({ extended: false }));//解析query形式参数
app.use(cookieParser());//使用cookie中间件
app.use(express.static(path.join(__dirname, 'public')));//设置public为静态文件目录

app.use('/', indexRouter);//注册路由
app.use('/users', usersRouter);//注册路由

// 404中间件
app.use(function(req, res, next) {
  next(createError(404));
});

// 处理错误中间件
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地部署生成式AI,选显卡or笔记本电脑?!新款酷睿Ultra举票

来源 | 算力豹 200亿个大模型参数无压力&#xff0c;新一代酷睿Ultra凭什么&#xff1f; 12月14日报道&#xff0c;在大模型军备竞赛如火如荼的今天&#xff0c;真正让AI铺开惠民&#xff0c;那么移动端、PC将成为首选&#xff0c;AI PC或成标配。英特尔今日奉上AI硬件大招&am…

对于c++的总结与思考

笔者觉得好用的学习方法&#xff1a;模板法 1.采用原因&#xff1a;由于刚从c语言面向过程的学习中解脱出来&#xff0c;立即把思路从面向过程转到面向对象肯定不现实&#xff0c;加之全新的复杂语法与操作&#xff0c;着实给新手学习这门语言带来了不小的困难。所以&#xff…

搞定Apache Superset

踩雷了无数次终于解决了Superset的一系列问题 现在是北京时间2023年12月27日&#xff0c;亲测有效。 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff…

<软考高项备考>《论文专题 - 32 成本管理(5) 》

6 收尾-经验教训 6.1 经验 1、做好计划&#xff0c;项目成本管理和我们的日常开支管理一样&#xff0c;如果不做好计划&#xff0c;很容易造成成本失控&#xff0c;最后是钱花光了&#xff0c;活没干完 2、要有冗余思想&#xff0c;受成本预算和实际之间的偏差以及项目中必不…

Postman常见问题及解决方法

1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xff1a; 检查网络连接是否正常&#xff0c;包括检查网络设置、代理设置等。 确认请求的URL是否正确&#xff0c;并检查是否使用了正确的HTTP方法&#xff08;例如GET、POST、PUT等&#…

HBase 例行灾备方案:快照备份与还原演练

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Oracle 12c rac 搭建 dg

环境 rac 环境 &#xff08;主&#xff09;byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;…

算法——哈希表

哈希表简介 **是什么&#xff1a;**存储数据的容器有什么用&#xff1a;快速查找某个元素&#xff0c;时间复杂度O(1)&#xff0c;空间复杂度O(n)**什么时候使用哈希表&#xff1a;**频繁查找某一个数&#xff08;这里不要忘了之前的二分&#xff0c;时间复杂度O(logN)&#x…

论文阅读:Large Language Models Are Zero-Shot Time Series Forecasters(2023NIPS)

摘要 文章涉及了两个时间序列的任务&#xff1a;forecasting&#xff0c;imputation. 对于预测任务&#xff1a;通过将时间序列编码为一系列数字&#xff0c;可以将时间序列预测任务转化为文本里面的next-token预测任务。在大规模预训练语言模型的基础上&#xff0c;文章提出了…

泰迪智能科技分享:AI大模型发展趋势分析

大规模预训练语言模型&#xff0c;也被称为“大模型”或“基座模型”&#xff0c;其特点在于拥有巨大的参数量&#xff0c;构成了复杂的人工神经网络模型。大模型具有规模性&#xff08;参数量大&#xff09;、涌现性&#xff08;产生预料之外的新能力&#xff09;以及通用性&a…

k8s二进制最终部署(网络 负载均衡和master高可用)

k8s中的通信模式 1、pod内部之间容器与容器之间的通信&#xff0c;在同一个pod 中的容器共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直接通信的 2、同一个node节点之内&#xff0c;不同pod之间的通信&#xff0c;每个pod都有一个全局的真实的IP地址&a…

最新国内使用GPT4教程,GPT语音对话使用,Midjourney绘画,ChatFile文档对话总结+DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

目录 ​专题一 开启大模型 专题二 基于ChatGPT大模型提问框架 专题三 基于ChatGPT大模型的数据清洗 专题四 基于ChatGPT大模型的统计分析 专题五 基于ChatGPT大模型的机器学习 专题六 基于ChatGPT大模型的科研绘图 专题七 基于ChatGPT大模型的GIS应用 专题八 基于基于C…

k8s集群etcd备份与恢复

一、前言 k8s集群使用etcd集群存储数据&#xff0c;如果etcd集群崩溃了&#xff0c;k8s集群的数据就会全部丢失&#xff0c;所以需要日常进行etcd集群数据的备份&#xff0c;预防etcd集群崩溃后可以使用数据备份进行恢复&#xff0c;也可用于重建k8s集群进行数据恢复 二、备份…

[C/C++]排序算法 快速排序 (递归与非递归)

目录 &#x1f6a9;概念: &#x1f6a9;实现: ⚡1.hoare ⚡2.挖坑法 ⚡3.双指针法 &#x1f6a9;快速排序递归实现 &#x1f6a9;快速排序非递归实现 &#x1f6a9;概念: 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据比另一部分的所有…

华为OD机试真题-手机App防沉迷系统-2023年OD统一考试(C卷)

题目描述&#xff1a; 智能手机方便了我们生活的同时&#xff0c;也侵占了我们不少的时间。“手机App防沉迷系统”能够让我们每天合理的规划手机App使用时间&#xff0c;在正确的时间做正确的事。 它的大概原理是这样的&#xff1a; 1、在一天24小时内&#xff0c;可注册每个Ap…

什么洗地机值得推荐?2024入门级智能洗地机

对于当代社畜&#xff0c;每天下班后回家已经疲惫不堪&#xff0c;但家务活仍然等待着处理。虽然外卖可以解决洗碗的问题&#xff0c;但地面的清洁却是无法回避的任务。传统的扫地、拖地流程让人感到腰酸背痛&#xff0c;因此人们纷纷寻找能够快速清洁地面的工具&#xff0c;如…

Shell命令与Linux操作系统:深入理解其原理和功能(2/2)

在当今数字化时代&#xff0c;操作系统的安全性和稳定性对于个人用户和企业都至关重要。Linux&#xff0c;作为一个广泛使用的操作系统&#xff0c;其强大的文件权限系统是保护系统安全的核心机制之一。无论是在服务器管理、软件开发还是日常使用中&#xff0c;有效地管理和理解…

scons_交叉编译arm64_sysroot基于根文件rootfs编译方法

文章目录 1.问题现象2.环境变量3.实例1:交编译arm64 hello.c解决方法1: 指定rootfs下的include头文件解决方法2: 下载开源arm64-linux-gnu-gcc小结 4.交叉编译依赖第3方库1.前言2.小知识: gcc默认搜索与支持的库3.实例: 交叉编译依赖ROS的程序gcc/g 编译流程gcc/g 链接流程 5.遇…

阿里云双11活动:如何通过客户端连接linux服务器?配置入门详解

前言 最近双11活动&#xff0c;发现阿里云有服务器活动&#xff0c;就买了一个&#xff0c;今天主要给大家介绍下&#xff0c;如何通过通过客户端进行连接linux服务器后&#xff0c;进行简单的操作。 配置服务器信息 打开浏览器登录到阿里云服务器页面上&#xff0c;找到个人…