express框架的基本使用

Posted luckest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了express框架的基本使用相关的知识,希望对你有一定的参考价值。

express框架的基本使用

1、express介绍

express是基于Node.js平台的极简、灵活的WEB应用开发框架。简单来说,express就是一个封装好的工具包,封装了很多功能,便于开发WEB应用(HTTP服务)

2、express使用

2.1、express下载

npm i express

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/home\', (req, res) => 
    res.end(\'hello express\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

2.2、express路由

一个路由有三个部分组成,请求方法、路径和回调函数。

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/home\', (req, res) => 
    res.end(\'hello express\');
);

app.get(\'/\', (req, res) => 
    res.end(\'home\');
);

app.post(\'/login\', (req, res) => 
    res.end(\'test\');
);

app.all(\'/test\', (req, res) => 
    res.end(\'all test\');
);

// 404响应,上面没有一个匹配就走这个路由
app.all(\'*\', (req, res) => 
    res.end(\'404\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

2.3、获取请求报文参数

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/request\', (req, res) => 
    // 原生操作
    console.log(req.method);
    console.log(req.url);
    console.log(req.httpVersion);
    console.log(req.headers);

    // express操作
    console.log(req.path);
    console.log(req.query);
    // 获取ip
    console.log(req.ip);
    // 获取请求头
    console.log(req.get(\'host\'));
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

2.4、获取路由参数

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/:id.html\', (req, res) => 
    // 获取URL路由参数
    console.log(req.params.id);
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

2.5、响应设置

express封装了一些API方便给客户端响应数据,并且兼容原生HTTP模块的获取方式。

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/response\', (req, res) => 
    // 1、express中设置响应的方式兼容HTTP模块的方式
    res.statusCode = 404;
    res.statusMessage = \'xxx\';
    res.setHeader(\'abc\',\'xyz\');
    res.write(\'响应体\');
    res.end(\'xxx\');

    // 2、express的响应方法
    res.status(500);
    res.set(\'xxx\', \'yyy\'); // 设置响应头
    res.send(\'xxx\'); // 设置响应体
    // 连贯操作
    res.status(404).set().send()

    // 3、其他响应
    res.redirect(\'http://www.baidu.com\'); // 重定向
    res.download(\'./package.json\'); // 下载响应
    res.json(); // 响应JSON
    res.sendFile(__dirname + \'/home.html\'); // 响应文件内容
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

2.6、express中获取请求体的数据

express可以使用body-parser包处理请求体。

安装:npm i body-parser

使用:

// 导入
const express = require(\'express\');
const bodyParser = require(\'body-parser\');

// 创建应用对象
const app = express();

// 解析JSON格式的请求体的中间件
const jsonParser = bodyParser.json();

// 解析querystring格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded( extended: false);

// 创建路由规则
app.get(\'/login\', (req, res) => 
    // res.send(\'表单页面\');
    res.sendFile(__dirname + \'/index.html\');
);

app.post(\'/login\', urlencodedParser, (req, res) => 
    console.log(req.body);
    res.send(\'获取用户数据\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

3、中间件

3.1、什么是中间件

Middleware本质上是一个回调函数。可以像路由一样访问请求对象和响应对象。

作用:用于封装公共操作,简化代码。

3.2、类型

  • 全局中间件
  • 路由中间件

3.3、全局中间件

每一个请求到达服务端之后,都会执行全局中间件函数。

// 导入
const express = require(\'express\');
const fs = require(\'fs\');
const path = require(\'path\');

// 创建应用对象
const app = express();

// 声明中间件函数
function recordMiddleware(req, res, next) 
    // 获取 url 和 ip
    let  url, ip  = req;
    // 将信息保存在文件中 access.log
    fs.appendFileSync(path.resolve(__dirname, \'./access.log\'), `$url   $ip\\r\\n`);
    next();


// 使用中间件函数
app.use(recordMiddleware);

// 创建路由
app.get(\'/home\', (req, res) => 
    res.send(\'前台首页\'); 
);

app.get(\'/admin\', (req, res) => 
    res.send(\'后台首页\'); 
);

app.all(\'*\', (req, res) => 
    res.send(\'404 no found\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

3.4、路由中间件

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 创建路由
app.get(\'/home\', (req, res) => 
    res.send(\'前台首页\'); 
);

// 声明中间件
let checkCodeMiddlerware = (req, res, next) => 
    if (req.query.code === \'521\') 
       next();
     else 
        res.send(\'暗号错误\');
    


app.get(\'/admin\', checkCodeMiddlerware, (req, res) => 
    res.send(\'后台首页\'); 
);

app.get(\'/setting\', checkCodeMiddlerware, (req, res) => 
    res.send(\'设置页面\'); 
);

app.all(\'*\', (req, res) => 
    res.send(\'404 no found\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

3.5、静态资源中间件

express内置处理静态资源的中间件。

// 导入
const express = require(\'express\');

// 创建应用对象
const app = express();

// 静态资源中间件设置
app.use(express.static(__dirname + \'/public\'));

// 创建路由
app.get(\'/home\', (req, res) => 
    res.send(\'前台首页\'); 
);

app.all(\'*\', (req, res) => 
    res.send(\'404 no found\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

注意事项:

  • 1、index.html为文件默认打开的资源。
  • 2、如果静态资源与路由规则同时匹配,谁先匹配谁就响应。
  • 3、路由响应动态资源,静态资源中间件响应静态资源。

4、防盗链

通过请求头中的referer来判断。

// 导入
const express = require(\'express\');
const bodyParser = require(\'body-parser\');

// 创建应用对象
const app = express();

// 声明中间件,防盗链
app.use((req, res, next) => 
    // 检测请求头中的referer是否是127.0.0.1
    let referer = req.get(\'referer\');
    console.log(referer);
    if (referer) 
        let url = new URL(referer);
        let hostname = url.hostname;
        if (hostname !== \'127.0.0.1\') 
            res.status(404).send(\'not found\');
        
    
    next();
)

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

5、路由模块化

创建routes文件夹,用来统一存放路由文件。

routes/homeRouter.js

// 导入
const express = require(\'express\');

// 创建路由对象
const router = express.Router();

router.get(\'/home\', (req, res) => 
    res.send(\'后台首页\');
);

module.exports = router;

6、模板引擎EJS

分离用户界面和业务数据的一种技术。

EJS是一种高效的JS的模板引擎。

安装:npm i ejs --save

6.1、初体验

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>我爱你 <%= china %></h1>
    <%= weather %>
</body>
</html>

index.js

const ejs = require(\'ejs\');
const fs = require(\'fs\');

let china = \'中国\';
let weather = \'天气晴\';

let str = fs.readFileSync(\'./index.html\').toString();
let result = ejs.render(str, china, weather);
console.log(result);

6.2、ejs列表渲染

const ejs = require(\'ejs\');
const fs = require(\'fs\');

let arr = [1,2,3,4,5];

let result = ejs.render(`<ul>
    <% arr.forEach(item =>  %>
        <li><%= item %></li>
    <% ) %>
</ul>
`,  arr );

console.log(result);

6.3、ejs的条件渲染

const ejs = require(\'ejs\');
const fs = require(\'fs\');

let isTrue = false;

let result = ejs.render(`
    <% if (isTrue)  %>
        <span>主人</span>
    <%  else  %>
        其他人
    <%  %>
`,  isTrue );

console.log(result);

6.4、express中使用EJS

创建views文件夹,用于存放模板文件,后缀名是ejs。

views/home.ejs:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1><%= title %></h1>
</body>
</html>

index.js:

// 导入
const express = require(\'express\');
const path = require(\'path\');

// 创建应用对象
const app = express();
// 1、设置模板引擎
app.set(\'view engine\', \'ejs\'); 
// 2、设置模板引擎文件存放位置
app.set(\'views\', path.resolve(__dirname, \'./views\'));

// 创建路由
app.get(\'/home\', (req, res) => 
    let title = \'你好\';
    res.render(\'home\', title);
);

app.all(\'*\', (req, res) => 
    res.send(\'<h1>404 not found!</h1>\');
);

app.listen(9000, () => 
    console.log(\'端口监听中...\');
);

7、express-generator工具

通过应用生成工具express-generator可以快速创建一个应用的骨架,相当于脚手架

可以通过npx(包含在Node.j
s8.2.0以及更高版本中)命令来运行Express应用程序生成器。

npx express-generator

对于较老版本的node,请通过npm将Express应用程序生成器安装到全局环境中使用:

npm install -g express-generator

express -e <项目名>,创建项目。

npm i 安装项目的依赖。

-h参数可以列出所有可用的命令行参数。

8、文件上传

使用formidable处理文件上传的请求。

npm i formidable

var express = require(\'express\');
var router = express.Router();
// 导入
const path = require(\'path\');
const formidable = require(\'formidable\');

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

// 显示网页的表单
router.get(\'/portrait\', (req, res) => 
  res.render(\'portrait\');
);

// 处理文件上传
router.post(\'/portrait\', (req, res) => 
  const form = formidable( 
    multiples: true,
    // 设置文件的保存目录
    uploadDir: path.resolve(__dirname, \'../public/images\'),
    // 保持文件后缀
    keepExtensions: true,
  );
  // 解析请求报文
  form.parse(req, (err, fields, files) => 
    if (err) 
      // next(err);
      console.log(err);
      return;
    
    console.log(fields); // text rdion checkbox select
    console.log(files); // file
    // 服务器保存该图片的访问URL
    let url  = \'/images/\' + files.portrait.newFilename; // 将来将此数据保存在数据库中
    res.send(url);
  );
);

module.exports = router;

使用express.js框架一步步实现基本应用以及构建可扩展的web应用

最近过年在家有点懈怠,但是自己也不断在学习新的前端技术,在家琢磨了express.js的web框架。

 

框架的作用就是提高开发效率,快速产出结果。即使不使用框架,我们也会在开发过程中逐渐形成构成框架。

 

大多数的node.js项目中都会用到express.js

 

目录:

一、什么是express.js框架

二、express.js是怎么工作的

三、expres.js的安装

四、express.js的脚手架

五、express.js的helloworld基本应用

 

一、什么是express.js框架?

Express.js框架是基于node.js的http模块和connect组件的web框架。Connect组件就是中间件,以约定大于配置原则作为开发理念。

 

如果使用核心的node.js模块来开发web应用,会发现很多的代码冗余,例如:

1、解析http请求消息

2、解析cookie

3、管理session

4、根据http请求的方法类型和url路径做路由解析

 

REST API服务包含两种路由方式,1、基于http请求类型;2、基于URL

开发人员不得不做很多繁琐的工作,需要做http请求方式,url路由解析,分析请求,响应数据等等。

 

Express.js很好的解决这些繁琐的工作,express.js框架提供了一个类似MVC的架构,,web应用提供了一个良好的结构(MVC)(模型,视图,路由)。

 

二、express.js是如何工作的?

Express.js是单入口的主文件启动。我们在node命令中启动这个文件。

这个文件中,以下事情:

1、引入第三方模块,比如控制器,公共模块,辅助模块和模型。

2、配置express.js,例如模板引擎

3、连接到数据库,mongoDB,redis,mysql

4、定义中间件

5、定义路由

6、启动应用

7、模块化输出应用

 

三、express.js的安装

Express包有两种形式:

1、express-generator:一个提供在命令行中快速搭建全局NPM包

2、express:一个在Node.js应用中的node_modules文件夹里的本地模块包

 

1、express.js生成器

以全局形式安装express.js生成器,命令行输入

npm install –g express-generator@4.0.0

 

2、本地expres.js

通过在命令行输入

mkdir 文件夹名

新建一个文件夹,这个文件夹名就是项目文件夹。

cd 文件夹名

打开该文件夹名。通过在命令行输入

npm init

创建package.json

 

最后通过npm安装模块,在命令行输入

npm install express@4.1.2 –save

 

四、express.js脚手架

具有基本的结构后,通过稳定的脚手架快速启动是非常有必要的,这就是为啥有那么多的不同类型的脚手架。

 

五、helloworld的web应用

不使用生成器,高级模块,中间件来搭建express.js的应用。

步骤:

1、创建文件夹

2、npm初始化和配置packag.json

3、依赖声明

4、app.js文件

5、结合jade

6、运行应用

 

1、创建文件夹

node_modules文件夹:express.js和第三方模块的依赖都在这个目录下

views文件夹:jade或者其他模板引擎文件

 

 

2、npm初始化和package.json

我们不用express.js生成器,手动创建一个express.js应用,npm是什么,npm是node.js 的包管理器,创建package.json文件是必须的。

(1)可以使用在命令行输入

npm init

输入完成之后就会生成一个package.json文件。

(2)也可以创建package.json文件的方式,写入或者复制粘贴package.json并运行。

package.json文件内容

{

"name": "express",

"version": "1.0.0",

"description": "" 

"main": "index.js",

"scripts": {

    "start": "node index.js"

  },

"dependencies":{

"express":"4.1.2",

"jade":"1.3.1",

"mongoskin":"1.4.1",

"stylus":"0.44.0"

},

 "author": "",

"license": "ISC"

}

3、index.js文件

index.js文件内容

var express = require(\'express\');

var http = require(\'http\');
var path = require(\'path\');

var app = express();

app.set(\'port\', process.env.PORT || 3001);
app.set(\'views\', path.join(__dirname, \'views\'));
app.set(\'view engine\', \'jade\');


app.all(\'*\', function(req, res) {
  res.render(\'index\', {msg: \'Welcome to my coding life!\\n欢迎来到coding世界\'})
})

http.createServer(app).listen(app.get(\'port\'), function(){
  console.log(\'Express server listening on port \' + app.get(\'port\'));
});

 

 

4、jade模板

 

 

5、运行

在命令行输入

node index

效果图,如下图所示

 

 

以上是关于express框架的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

Node.jsExpress框架的基本使用

使用express.js框架一步步实现基本应用以及构建可扩展的web应用

Ajax的基本使用(以express框架为例)

对于express框架的基本理解

Node.js Express 框架

node基础3--express框架