NodeJs学习笔记(三)使用Express创建RESTful服务

1.什么是Express

Express是一个快速轻量级创建web服务的框架

2.安装Express

npm i express

3.使用Express

const express = require('express');//返回Express类
const app = express();//返回一个Express类型的对象

app.get('/',(req,res)=>{
    res.send("Hello,World!");
})
app.get('/hello',(req,res)=>{
    res.send("Hello");
})

app.listen(3000,()=>{console.log("正在监听3000端口")});

app.get()第一个参数为URL,第二个参数为回调函数,这个函数在给指定端口使用get方法时被调用。回调函数有两个参数:requestresponse

4.Node监视器

每次修改应用,我们都需要手动重启,为避免此麻烦,我们使用一个叫做nodeMon的包,其全称为node Monitor
安装后使用nodemon命令运行即可
Windows系统可能会报如下错误:

nodemon : 无法加载文件 C:\Users\Zijeak\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/ 
?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ nodemon index.js
+ ~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

解决办法可以参考下面这篇博客
https://blog.csdn.net/qq_38634152/article/details/104392381

5.环境变量

app.listen(3000,()=>{console.log("正在监听3000端口")});

这句代码,我们监听了3000端口,将端口号写死的方式在开发环境可以,但部署到生产环境就可能因为动态端口分配的问题导致3000端口不一定可用。
为了解决这个问题,我们使用环境变量。
环境变量就是在进程运行是才产生的变量,它是在应用之外设置的变量。
我们需要读取环境变量的PORT属性,为此我们要使用全局对象:process对象。

const port = process.env.PORT || 3000
app.listen(port,()=>{console.log(`正在监听${port}端口`)});

如果PORT设置了,我们就用它,否则就用3000
在windows系统环境下,我们使用set命令设置环境变量:

set PORT=5000

注意:这条命令一定在管理员权限下运行,否则没有作用。

6.路由参数

app.get('/book/:id',(req,res)=>{
    res.send(req.params.id);
});

访问http://127.0.0.1:5000/book/1
显示结果为1

多个参数的情况也类似:

app.get('/posts/:year/:month',(req,res)=>{
    res.send(req.params);
});

{“year”:“2020”,“month”:“1”}

也可以在路由规则中使用查询字符串
使用http://127.0.0.1:5000/posts/2020/1?queryWord=china
即可在req.query属性中获取字符串参数
{“queryWord”:“china”}

7.处理HTTP GET请求

const express = require('express');//返回Express类
const app = express();//返回一个Express类型的对象

const books = [
    {'id':1,'name':"三国演义"},
    {'id':2,'name':"三体"},
    {'id':3,'name':"围城"}
];
app.get('/',(req,res)=>{
    res.send("Hello,World!");
});
app.get('/book',(req,res)=>{
    res.send(books);
});
app.get('/book/:id',(req,res)=>{
    const book = books.find(b => b.id === parseInt(req.params.id) );
    if(!book){//404
        res.status(404).send("给定的书籍ID不存在");
    }else{
        res.send(book);
    }
});


const port = process.env.PORT || 3000;
app.listen(port,()=>{console.log(`正在监听${port}端口`)});

在这里插入图片描述

8.处理HTTP POST请求

app.post('/book/',(req,res)=>{
    const book = {
        'id':books.length + 1,
        'name':req.body.name
    };
    books.push(book);
    res.send(book);
})

在此之前,需要添加这样一行代码:

app.use(express.json());

使用Chrome插件Postman进行测试
在这里插入图片描述

9.验证输入

上面的代码都没有对输入内容进行验证,比如说POST请求中书名的长度过短、书名根本不存在等情况。
对于简单、数据量小的情况,我们可以手动利用if语句进行判断,进而进行处理。
但是对于复杂的应用,这样做就显得愚笨。
因此我们使用这样一个包:joi,这个包可以帮我们轻松验证输入。
安装:npm i joi
使用:const Joi = require('joi');//返回joi类
改造后的代码:

app.post('/book/',(req,res)=>{
    const schema = {
        name:Joi.string().min(3).required()
    };
    const result = Joi.validate(req.body,schema);//这个验证方法会返回一个对象
    //console.log(result);
    if(result.error){
        res.status(400).send(result.error.details[0].message);
    }
    const book = {
        'id':books.length + 1,
        'name':req.body.name
    };
    books.push(book);
    res.send(book);
})

在这里插入图片描述

10.处理HTTP PUT请求

app.put('/book/:id',(req,res)=>{
    //查找书籍
    const book = books.find(b => b.id === parseInt(req.params.id) );
    if(!book){//404
        res.status(404).send("给定的书籍ID不存在");
    }else{
        res.send(book);
    }
    //验证
    const result = validateBook(req.body);
    if(result.error){
        res.status(400).send(result.error.details[0].message);
        return;
    };

    book.name = req.body.name;
    res.send(book.name);
})

function validateBook(book){
    const schema = {
        name:Joi.string().min(3).required()
    };
    return Joi.validate(book,schema);//这个验证方法会返回一个对象
}

11.处理HTTP DELETE请求

app.delete('/book/:id',(req,res)=>{
    //查找书籍
    const book = books.find(b => b.id === parseInt(req.params.id) );
    if(!book){//404
        res.status(404).send("给定的书籍ID不存在");
        return;
    }else{
        res.send(book);
    }
    
    const index = books.indexOf(book);
    books.splice(index,1);

    res.send(book);
});

12.联系

const Express = require("express");
const app = Express();
const Joi = require("joi");
app.use(Express.json());

var genres = [
    {id:1,name:"国产"},
    {id:2,name:"港澳台"},
    {id:3,name:"好莱坞"},
    {id:4,name:"日韩"},
    {id:5,name:"泰国"},
    {id:6,name:"印度"}
];
//查
app.get('/api/genres',(req,res)=>{
    res.send(genres);
});
app.get('/api/genres/:id',(req,res)=>{
    const result = genres.find(b => b.id === parseInt(req.params.id));
    if(!result) return res.send("指定的ID不存在!");
    res.send(result);
});

//增
app.post('/api/genres',(req,res)=>{
    const schema = {
        name:Joi.string().min(2).required()
    };
    const result = Joi.validate(req.body,schema);
    if(result.error){
        res.status(400).send(result.error.details[0].message);
    }
    const temp = {
        id:genres.length+1,
        name:req.body.name
    };
    genres.push(temp);
    res.send(genres);
});

//改
app.put('/api/genres/:id',(req,res)=>{
    //先验证存不存在
    const temp = genres.find(b => b.id === parseInt(req.params.id));
    if(!temp) return res.send("指定的ID不存在!");

    //再验证给的值正不正确
    const schema = {
        name:Joi.string().min(2).required()
    };
    const result = Joi.validate(req.body,schema);
    if(!result) return res.status(400).send(result.error.details[0].message);
    //更改
    temp.name = req.body.name;
    res.send(genres);
});

//删
app.delete("/api/genres/:id",(req,res)=>{
    //先验证存不存在
    const temp = genres.find(b => b.id === parseInt(req.params.id));
    if(!temp) return res.send("指定的ID不存在!");
    //删除
    const index = genres.indexOf(temp);
    genres.splice(index,1);
    res.send(genres);
});

const port = process.env.PORT || 3000;
app.listen(port,()=>{console.log(`正在监听${port}端口`)});

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值