• REST API with Mongoose


    REST API with Mongoose

    在REST API Server中,每一个来自前端的请求都要进行相应的后端数据库操作。

    例如,响应GET请求要在数据库进行数据检索:为了端到端地处理GET请求,一个来自客户端的GET请求,意味着客户端想要在服务端检索数据来使用;所以,要经过多个Express 服务的处理,然后业务逻辑需要在数据库中执行一个查询操作;启动一个查询操作,从数据库获取一组documents,再转换为回复信息,发回给服务器。

    所以,这个端到端的请求响应处理涉及到两个部分,一部分是处理业务逻辑,一部分是与数据库进行交互。

    再来看POST请求:

    POST请求通过请求体发送信息,请求体经Express Server处理后,启动相应的create请求到MongoDB,在create请求中,将在数据库中某个collection中创建新的document,并将处理后的请求体信息存储到其中。最后,这个操作到的结果通过响应发回给客户端。

    所以,对REST API端执行的任何操作,无论是GET、PUT、POST还是DELETE,都会在背后启动对应的数据库操作。也就是说,在REST API端收到的HTTP请求必须映射到相应的数据库操作。

    更改dishRouter.js

    const express = require('express')
    const bodyParser = require('body-parser')
    const mongoose = require('mongoose')
    
    const Dishes = require('../models/dishes')
    
    const dishRouter = express.Router()
    
    dishRouter.use(bodyParser.json())
    
    dishRouter.route('/')
    .get((req, res, next) => {
        Dishes.find({})
        .then((dishes) => {
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(dishes)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .post((req, res, next) => {
        Dishes.create(req.body)
        .then((dish) => {
            console.log('Dish Created ', dish)
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(dish)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .put((req, res, next) => {
        res.statusCode = 403
        res.end('PUT operation not supported on /dishes')
    })
    .delete((req, res, next) => {
        Dishes.reomve({})
        .then((resp) => {
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(resp)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    
    dishRouter.route('/:dishId')
    .get((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(dish)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .post((req, res, next) => {
        res.statusCode = 403
        res.end('POST operation not supported on /dishes/' + req.params.dishId)
    })
    .put((req, res, next) => {
        res.statusCode = 200
        Dishes.findByIdAndUpdate(req.params.dishId, {
            $set: req.body
        }, {
            new: true	// 返回改变后的document
        })
        .then((dish) => {
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(dish)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .delete((req, res, next) => {
        Dishes.findByIdAndRemove(req.params.dishId)
        .then((resp) => {
            res.statusCode = 200
            res.setHeader('Content-Type', 'application/json')
            res.json(resp)
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    
    dishRouter.route('/:dishId/comments')
    .get((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null) {
                res.statusCode = 200
                res.setHeader('Content-Type', 'application/json')
                res.json(dish.comments)
            } else {
                err = new Error('Dish' + req.params.dishId + ' not found')
                err.status = 404
                return next(err)
            }
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .post((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null) {
                dish.comments.push(req.body)
                dish.save()
                .then((dish) => {
                	res.statusCode = 200
                    res.setHeader('Content-Type', 'application/json')
                    res.json(dish)    
                }, (err) => next(err))
            } else {
                err = new Error('Dish ' + req.params.dishId + ' not found')
                err.status = 404
                return next(err)
            }
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .put((req, res, next) => {
        res.statusCode = 403
        res.end('PUT operation not supported on /dishes/' + req.params.dishId + '/comments')
    })
    .delete((erq, res next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null) {
                for (let i = (dish.comments.length - 1); i >= 0; i--) {
                    dish.comments.id(dish.comments[i]._id).remove()
                }
                dish.save()
                .then((dish) => {
                    res.statusCode = 200
                    res.setHeader('Content-Type', 'application/json')
                    res.json(dish)
                }, (err) => next(err))
            } else {
                err = new Error('Dish ' + req.params.dishId + ' not found')
                err.status = 404
                return next(err)
            }
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    
    dishRouter.route('/:dishId/comments/:commentId')
    .get((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null && dish.comments.id(req.params.commentId) != null) {
            	res.statusCode = 200
                res.setHeader('Content-Type', 'application/json')
                res.json(dish.comments.id(req.params.commentId))
            } else if(dish == null) {
                err = new Error('Dish ' + req.params.dishId + ' not found')
                err.statusCode = 404
                return next(err)
            } else {
                err = new Error('Comment ' + req.params.commentId + ' not found')
                res.statusCode = 404
                return next(err)
            }
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    .post((req, res, next) => {
        res.statusCode = 403
        res.end('POST operation not supported on /dishes/' + req.params.dishId + '/comments/' + req.params.commentId)
    })
    .put((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null && dish.comments.id(req.params.commentId) != null) {
          		if (req.body.rating) {
                    dish.comments.id(req.params.commentId).rating = req.body.rating
                }
                if (req.body.comment) {
                    dish.comments.id(req.params.commentId).comment = req.body.comment
                }
                dish.save()
                .then((dish) => {
                    res.statusCode = 200
                    res.setHeader('Content-Type', 'application/json')
                    res.json(dish)
                }, (err) => next(err))
            } else if (dish == null) {
                err = new Error('Dish ' + req.params.commentId + ' not found')
                err.statusCode = 404
                return next(err)
            }  else {
                err = new Error('Comment ' + req.params.commentId + ' not found');
                err.status = 404;
                return next(err);            
            }
        }, (err) => next(err))
        .catch((err) => next(err));
    })
    .delete((req, res, next) => {
        Dishes.findById(req.params.dishId)
        .then((dish) => {
            if (dish != null && dish.comments.id(req.params.commentId) != null) {
                dish.comments.id(req.params.commentId).remove()
                dish.save()
                .then((dish) => {
                    res.statusCode = 200
                    res.setHeader('Content-Type', 'application/json');
                    res.json(dish)             
                }, (err) => next(err))
            } else if (dish == null) {
                err = new Error('Dish ' + req.params.dishId + ' not found');
                err.status = 404
                return next(err)
            } else {
                err = new Error('Comment ' + req.params.commentId + ' not found');
                err.status = 404
                return next(err)         
            }
        }, (err) => next(err))
        .catch((err) => next(err))
    })
    
    module.exports = dishRouter
    

    res.send()res.json()res.end()的区别

  • 相关阅读:
    html图片预览
    网易DBA私享会分享会笔记2
    网易DBA私享会分享会笔记1
    centos6.5适用的国内yum源:网易、搜狐
    如何去除 ckeditor 上传图片后在原码中留下的 style="width: 100%;height:100px"之类的代码呢?
    关于json.ajax ,php的那点事
    去掉所有的html标签
    about JNI
    some knowledge of maven {maven实战}
    What is Proguard?
  • 原文地址:https://www.cnblogs.com/wydumn/p/12456499.html
Copyright © 2020-2023  润新知