Express NodeJs Web框架 入门笔记

时间:2023-02-21 07:37:01

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

  • 使用 Express 可以快速地搭建一个完整功能的网站。
  • Express 框架核心特性:
  • 可以设置中间件来响应 HTTP 请求。
  • 定义了路由表用于执行不同的 HTTP 请求动作。
  • 可以通过向模板传递参数来动态渲染 HTML 页面。

前提知识

  • NodeJs

  • NPM

创建项目

  • 初始化

这里我们使用npm初始化一个项目,直接回车使用默认参数

$ mkdir ~/myExpress
$ cd ~/myExpress
$ npm init
  • 安装Express
$ npm install express --save
  • 创建入口文件app.js
$ touch app.js

基础示例

使用IDE打开项目(推荐Vscode或者WebStorm) 编辑app.js文件

// 引入依赖
var express = require('express')
var app = express() // 定义port常亮
const port = 3030; // 创建一个简单GET路由
app.get("/",function(req,res){
res.send("Hello,World");
}); // 启动服务,第二个参数为callback()
app.listen(port,function(){
console.log(`Express 应用启动在${port} 端口`);
});

命令行切换到app.js目录下

$ node app.js

打印出Express 应用启动在3030 端口,在浏览器或者CURL访问http://localhost:3030即可看到Hello,World

$ curl -XGET http://localhost:3030/

路由设置

在上面的代码示例中我们使用了一个简单HelloWorld代码,使用了GET的请求方式,同样的Express也支持其他的Method,如POST,PATCH,DELETE等等,下面我们简单的写一下

// 引入依赖
var express = require('express')
var app = express() // 定义port常亮
const port = 3030; // 创建一个简单GET路由
app.get("/",function(req,res){
res.send("Hello,World");
}); app.post("/post",function(req,res){
var method = req.method;
res.send(`发现${method} 请求`)
}); app.patch("/patch",function(req,res){
var method = req.method;
res.send(`发现${method} 请求`)
}); app.delete("/delete",function(req,res){
var method = req.method.name;
res.send(`发现${method} 请求`)
}); // 启动服务,第二个参数为callback()
app.listen(port,function(){
console.log(`Express 应用启动在${port} 端口`);
});

如果你需要添加全部的请求方式,可以使用app.all(path,callback);

由于POST等请求不能再浏览器输入地址访问,这里我们继续使用CURL来测试,没有这个工具的可以使用PostMan测试.

$ curl -XGET http://localhost:3030
Hello,World $ curl -XPOST http://localhost:3030/post
发现POST 请求 $ curl -XPATCH http://localhost:3030/patch
发现PATCH 请求 $ curl -XDELETE http://localhost:3030/delete
发现DELETE 请求

静态文件

Express可以设置某个目录为静态文件目录,里面的资源我们可以直接通过URL访问,在app.js同级目录下执行以下脚本

$ mkdir public && cd public
$ echo "<h1>这里是静态资源文件内容</h1?" >> ./static.html

修改app.js文件,添加以下代码

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

访问http://localhost:3030/static.html

$ curl -XGET http://localhost:3030/static.html
<h1>这里是静态资源文件内容</h1>

同样的,你也可以放入其他类型的资源,如JSON文件,图像,纯文本,CSS等.

Route模块

在上面示例中,我们可以使用下面的代码创建路由

var express = require('express')
var app = express() app.get("/",function(req,res,next){}) app.get("/book",function(req,res,next){}) app.post("/book",function(req,res,next){})

显然这样并不利于我们的代码管理,因此这里引入express.Route模块来模块化处理路由,下面我们有如下需求:

  • 创建 GET /

  • 创建 GET /book/nodejs

  • 创建POST /book/

    其中 /book/**单独存放于路由模块中

app.js同级目录下创建book.js文件代码内容如下:

var express = require('express');
// 创建router
var router = express.Router(); // 在router中设置路由
router.get('/:id', function (req, res, next) {
var book = {
id: req.params.id,
name: "深入浅出NodeJS"
};
res.send(JSON.stringify(book))
}); router.post("/", function (req, res, next) {
res.send("POST /book")
}); // 对外暴露
module.exports = router;

同样的app.js则需要引入上面router文件

// 引入依赖
var express = require('express')
var app = express() // 引入router
var book_router = require('./book') // 定义port常亮
const port = 3030; // app 使用该router
app.use('/book',book_router) // 创建一个简单GET路由
app.get("/",function(req,res){
res.send("Hello,World");
}); // 启动服务,第二个参数为callback()
app.listen(port,function(){
console.log(`Express 应用启动在${port} 端口`);
});

启动应用,在命令行中访问,即结果如下:

$ curl -XGET http://localhost:3030/
Hello,World $ curl -XGET http://localhost:3030/book/ISBN-123
{"id":"ISBN-123","name":"深入浅出NodeJS"} $ curl -XPOST http://localhost:3030/book/
POST /book

NodeJs中的中间件

中间件,英文middleWare ,假设我们需要在控制台打印所有请求的消耗的时间信息,以及URL,那么我们给每个路由都加上代码,显然是很愚蠢的,那么我们可以为这些路由请求设置中间件,利用中间件来而完成统计.

修改appjs代码为以下内容:

// 引入依赖
var express = require('express')
var app = express() const port = 3030 /**
* 定义中间件函数
* @param req ---> requesr
* @param res ---> response
* @param next ---> 将请求传递到下一个中间件函数
*/
function logMiddleWare(req, res, next) {
var url = req.originalUrl;
// 记录开始执行时间
var start = Date.now();
// 向request中写入数据,在后面的中间件函数中可以获取到该参数
req.start_time = start
// 执行下一个中间件函数(在这里也就是路由的callback)
next();
// 记录完成时间
var end = Date.now();
// 打印日志
console.log(`${url} 请求完成时间:`, end - start, "ms");
} // 使用该中间件
app.use(logMiddleWare) app.get("/time", function (req, res, next) {
console.log(`获取到的参数start_time = ${req.start_time}`);
res.send(`<h1>/${req.start_time}</h1>`);
}); // 服务启动
app.listen(port, function () {
console.log(`服务启动在${port} 端口`);
});

我们测试以下:

curl -XGET http://localhost:3030/time 返回<h1>1541220185998</h1>,这里主要看一下控制台打印的信息

服务启动在3030 端口
获取到的参数start_time = 1541220185998
/time 请求完成时间: 6 ms

可以看到,首先是服务启动在3030 端口信息,接着我们开始请求/time,记录下了start_time,并写入到request中,接着在/time的回调函数中打印了该参数,执行完成之后,继续返回到 logMiddleWare 中记录下end_time,打印出耗时 6 ms

集成持久层(redis)

NodeJS支持多种数据库持久操作,比如常用的Redis,Mysql,MongoDB等等,那么这里我们简单的使用redis作为测试以下.首先说一下需求:

  • 创建一个请求为 POST /redis/:content 将content写入到redis中

  • 创建一个请求为 GET /redis 用户获取之前的设置

Ps: 这里我是用了docker来部署了一个redis服务器,如下

$ docker pull redis
$ docker run -d -p 6379:6379 --name redis_6379 redis
$ docker ps # 观察Redis运行情况
# 重启redis `docker restart redis_6379`

首先你需要安装redis依赖,项目目录下执行npm install redis --save安装即可,修改app.js内容如下

// 引入依赖
var express = require('express');
var redis = require('redis')
var app = express() const port = 3030
const redis_port = 6379 // 创建Redis client 端口为6379
var client = redis.createClient(redis_port,'localhost'); /**
* 设置Redis的回调事件,当redis出现连接失败的时候,执行之
*/
client.on('error',function (error) {
console.log("Redis 连接出现异常")
}); app.post("/redis/:content",function (req, res, next) {
var content = req.params.content;
// 设置字符串到redis中 KV结构
client.set('KEY',content)
res.send("Redis设置完成")
}) app.get("/redis",function (req, res, next) {
client.get('KEY',function (err, value) {
res.send(value)
})
}) // 服务启动
app.listen(port, function () {
console.log(`服务启动在${port} 端口`);
});

测试内容如下

$ curl -XPOST http://localhost:3030/redis/Keep_it_simple_and_stupid
Redis设置完成 $curl -XGET http://localhost:3030/redis
Keep_it_simple_and_stupid

当然也可以在Redis客户端中查询数据

Express NodeJs Web框架 入门笔记

Express NodeJs Web框架 入门笔记的更多相关文章

  1. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  2. 教程:Visual Studio 中的 Django Web 框架入门

    教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...

  3. CI框架入门笔记

    当前(2019-03-22)CodeIgniter 框架的最新版本是 3.1.5,于2017年6月发布,距今快两年了也没有更新,这与 Laravel 的更新速度相比差距太大了.因为确实,它是一个很古老 ...

  4. 一看就懂的Mybatis框架入门笔记

    本篇为初学Mybatis框架时的入门笔记,整理发出 Spring集成Mybatis https://www.cnblogs.com/yueshutong/p/9381590.html SpringBo ...

  5. Python Flask Web 框架入门

    Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...

  6. python web框架学习笔记

    一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(cli ...

  7. Django Web框架入门

    一.Django介绍 Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很 ...

  8. Shiro安全框架入门笔记

    入门 1.simpleRealmTest package cn.realm; import org.apache.shiro.SecurityUtils; import org.apache.shir ...

  9. web安全入门笔记

    0x01 前言 这正邪两字,原本难分. 正派弟子若是心术不正,便是邪徒. 邪派中人只要一心向善,便是正人君子. 0x01 信息安全的定义 信息安全,意为保护信息及信息系统免受未经授权的进入.使用.披露 ...

随机推荐

  1. Response&period;StatusCode的HTTP状态代码列表

    1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. · 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.( ...

  2. 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 &amp&semi;&amp&semi; 类是一种代码重用机制

    五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...

  3. 为什么Erlang比C慢那么多倍?

    Erlang 一直以慢“著称”,本文就来看看 Erlang 慢在什么地方,为什么比实现同样功能的 C 语言程序慢那么多倍.Erlang 作为一种虚拟机解释的语言,慢是当然的.不过本文从细节上分析为什么 ...

  4. jquery json ajax

    当html中用script包含了不在同一个目录下的js外部文件(主要是为了通用代码的重用)时,这个js文件的 内容就如同在当前html文件中了,写jquery的时候不用考虑路径问题,可以直接引用htm ...

  5. UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法

    首先,视图控制器必须得实现协议UIAlertViewDelegate中的方法,并指定delegate为self,才能使弹出的Alert窗口响应点击事件. 具体代码如下: ViewController. ...

  6. JAVA Web 之 struts2文件上传下载演示&lpar;一&rpar;&lpar;转&rpar;

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  7. 一起学习android图像缩放资源 (27)

    效果图: 在平时载入图片时,我会使用SetImageBitmap.setImageResource.BitmapFactory.decodeResource来设置一张图 片通过以上方法来设置图片时.会 ...

  8. js原型杂谈

    1.通俗点讲原型对象就是内存中为其他对象提供共享属性和方法的对象. 2.所有原型对象都具备一个constructor属性,这个属性是一个指向包含prototype属性函数的一个指针(敢不敢再绕点!). ...

  9. pandas&period;DataFrame

    1.可以使用单个列表或列表列表创建数据帧(DataFrame). 单个列表 import pandas as pd data = [1,2,3,4,5] df = pd.DataFrame(data) ...

  10. Python3基础 e记法示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...