nodejs开发——express框架学习

本文将深入探讨在Node.js开发中广泛使用的Express框架。我们将学习如何加载框架,创建服务,理解Express的路由机制,包括GET和POST请求的处理,如何返回JSON格式的数据,接收请求参数以及通过路由实现模块化编程。同时,文章还将介绍Express中的中间件概念。
摘要由CSDN通过智能技术生成

      在我们实际开发项目时,总是会用一些框架,而不是自己从头开始开发。而在nodejs中,express框架就是一个使用频率最高的一个框架。本篇主要来讲解express的使用。

  • 加载express框架
       由于express不是系统框架,所以需要手动加载,在项目目录下使用命令“npm install express --save”   ,就可以在项目中集成express框架,使用--save参数是能自动把express的参数配置到项目的package.json中。


  • express创建服务
      使用express可以方便的创建一个服务器,从而响应客户端的请求,在js文件中实现如下:
//加载express模块
var express = require("express");
//创建一个express模块的实例
var app = express();

//创建服务,设置监听,设置端口号为3000
app.listen(3000, function () {

    console.log('Server running at http://127.0.0.1:3000/');
});

从代码中看到,express创建服务的方式与http模块非常类似,因为express本身就是封装了http模块。但是上面的代码还不能响应任何的url请求,这就需要借助下面的路由。

  • express路由
       路由就是用来处理不同url请求的,根据不同的请求,进行不同的响应内容。js文件实现如下:
var express = require("express");
var app = express();

//根据不同的请求进行响应
//主url的响应,后面不带子路径
app.get("/", function (req, res) {
    res.send("这是主页");
});

app.get("/getName", function (req, res) {
    res.send("查找名字");
    //获得请求url中的一些参数
    console.log("baseUrl:" + req.baseUrl);
    console.log("body:" + req.body);
    console.log("hostname:" + req.hostname);
    console.log("originalUrl:" + req.originalUrl);
    console.log("params:" + req.params);
    console.log("path:" + req.path);
    console.log("protocol:" + req.protocol);
    console.log("query:" + req.query);
    console.log("subdomains:" + req.subdomains);
});

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});


然后进行测试,请求http://localhost:3000




请求http://localhost:3000/getName




同时,我在控制台上打印一些请求url中的信息:




  • Get请求与Post请求
       express同样可以非常方便的来处理不同的请求类型,比如Get请求和Post请求。上述的例子是使用Get请求,下面的我把getName接口设计成Post请求,代码修改如下:
var express = require("express");
var app = express();

//根据不同的请求进行响应
//主url的响应,后面不带子路径
app.get("/", function (req, res) {
    res.send("这是主页");
});

app.post("/getName", function (req, res) {
    res.send("post查找名字");
});

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});

如果此时getName继续使用使用Get方式请求,就会发生如下错误:表示无法使用Get



如果使用post,则能成功返回:






  • 返回JSON格式
     JSON(JavaScript Object Notation)原意表示的就是JavaScript里的一个对象,所以在nodejs中返回JSON格式非常方便,也就是直接返回一个对象即可。下面修改getName接口,返回一个JSON格式:

var express = require("express");
var app = express();

//根据不同的请求进行响应
//主url的响应,后面不带子路径
app.get("/", function (req, res) {
    res.send("这是主页");
});

app.post("/getName", function (req, res) {
    // 输出 JSON 格式,JSON对象也可以嵌套
   var result = {
        first_name: "chen",
        last_name: "yufeng",
        age: 25
    };
    res.send(JSON.stringify(result));
});

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});

Postman中请求结果如下:



  • 接收请求的参数
      在前端用某个url请求时,也可以携带参数,而在服务端也可以捕获这些参数,根据不同的参数进行返回(往往使用这些参数去查找数据库,会在后面的博客中介绍)。这里我们通过示例来演示:

var express = require("express");
var app = express();

//根据不同的请求进行响应
//主url的响应,后面不带子路径
app.get("/", function (req, res) {
    res.send("这是主页");
});

app.post("/getName", function (req, res) {
    // 输出 JSON 格式,JSON对象也可以嵌套
    console.log("性别:" + req.query.gender + ";国籍:" + req.query.country);
    var result = {
        first_name: "chen",
        last_name: "yufeng",
        age: 25
    };
    res.send(JSON.stringify(result));
});

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});

请求的url中分别发送gender性别参数和country国籍参数,服务端获取后打印到控制台上,在Postman上请求如下:



在WebStorm控制台上打印如下:


由此可见,服务端已经成功获取到请求url中发送过来的参数了。这样就可以非常方便的进行前后端的数据交互了。




  • 使用路由进行模块化编程
       在nodejs中使用路由的最主要目的是进行模块化编程,即把不同请求需要执行的代码分开到不同的js文件中去,从而不需要把所有的业务代码都放在一个js文件中,这有利于代码维护和扩展。

在服务器主文件实现如下:
var express = require("express");
var app = express();

//根据不同的请求进行响应
//主url的响应,后面不带子路径
app.get("/", function (req, res) {
    res.send("这是主页");
});

//把getName这个请求由同一目录下的name.js来处理
var name = require("./name");
app.post("/getName", name.getName);

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});

然后在同一目录下新建name.js文件,实现如下:
//使用exports导出该模块,可被外界调用,处理getName这个路由
module.exports.getName = function (req, res) {
    // 输出 JSON 格式,JSON对象也可以嵌套
    console.log("性别:" + req.query.gender + ";国籍:" + req.query.country);
    var result = {
        first_name: "chen",
        last_name: "yufeng",
        age: 25
    };
    res.send(JSON.stringify(result));
    res.end();
};

然后在Postman中请求结果如下,符合我们的预期,结果与上一个案例一样,但是项目结构更好,是强烈推荐的实现方式。



  • 中间件
       express应用其实就是由一系列顺序执行的中间件组成的。如果当前中间件没有完成对当前网页的res响应,还可以通过next()把路由留给下一个中间件继续执行。其中使用中间件的一个目的也是实现模块化。
在服务端主文件中实现如下:
var express = require('express');
var app = express();

var name = require('./name');
//在一组挂载点装载一组中间件
//前面的'/getName' 是挂载路径,在一组挂载点装载一组中间件
app.post('/getName',name.name01, name.name02, name.name03);

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});


在同一目录下创建name.js文件,实现如下:
var express = require('express');

/**
 * 中间件栈
 *
 * @param req
 * @param res
 * @param next
 */
module.exports.name01 = function (req, res, next) {
    console.log("第一个中间件");
    //继续由下一个get去处理
    //将控制权交给下一个中间件
    //todo
    next();
};

module.exports.name02 = function (req, res, next) {
    console.log("第二个中间件");
    //todo
    next();
};

module.exports.name03 = function (req, res) {
    console.log("第三个中间件");
    console.log("性别:" + req.query.gender + ";国籍:" + req.query.country);
    var result = {
        first_name: "chen",
        last_name: "yufeng",
        age: 25
    };
    res.send(JSON.stringify(result));
    res.end();
};

然后在Postman中请求可以获得和上个例子一样的结果,在WebStorm控制台中打印结果如下:


整个请求过程通过了每一个中间件。每一个中间件中都可以进行业务代码的处理。其实中间件相当于起一个过滤的作用,所有匹配这个路径的都会被执行。nodejs中间件中还有一个use关键字的用法,修改上述代码:
var express = require('express');
var app = express();

//中间件相当于起一个过滤的作用,所有匹配这个路径的都会被执行;
app.use('/', function (req, res, next) {
    console.log("所有的url请求都会通过这个中间件");
    next();
});

var name = require('./name');
//在一组挂载点装载一组中间件
//前面的'/getName' 是挂载路径,在一组挂载点装载一组中间件
app.post('/getName',name.name01, name.name02, name.name03);

app.listen(3000, function () {
    console.log('Server running at http://127.0.0.1:3000/');
});

使用app.use去匹配url,因为必然所有的请求都包含"/",所以该中间件中的逻辑都会被执行。然后使用next()传递给下一个中间件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值