繁体   English   中英

无论如何运行Node JS PATCH请求

[英]Node JS PATCH request running no matter what

对不起,如果标题令人困惑,我不太确定如何措辞。 我有一个 PATCH 请求来更新我的数据库中的一个值,但即使它正在“工作”(200 状态),它实际上也不是。 我有一个.route('/:movie_id/:user_id').all()处理程序来触发我的所有方法,它通过 movie_id 和 user_id 从数据库中提取一部电影。 这行得通。 然后我继续我的 PATCH 请求,但看起来 PATCH 请求实际上并没有运行。 我从 .all() 处理程序中得到了正确的响应,但没有更新。 即使我完全注释掉我的 PATCH 的代码,我仍然会得到 200 状态。

这是带有我的 PATCH 请求的 my.all() 处理程序:

movieRouter
    .route('/:movie_id/:user_id')
    .all(requireAuth)
    .get((req, res, next) => {
        const db = req.app.get('db')
        MovieService.getById(db, req.params.movie_id, req.params.user_id)
        .then(movie => {
            if(!movie) { // this runs fine
                return res.status(404).json({ error: `Movie doesn't exist`})
            }
            // res.json({movie : movie}); --> old code
            // solution:
            res.movie = movie;
            next();
            return movie;
        })
        .catch(next)
    })
    .patch(requireAuth, (req, res, next) => {
        const db = req.app.get('db')
        const { watched } = req.body
        const updatedMovie = { watched }

        // this doesn't run
        const numVal = Object.values(updatedMovie).filter(Boolean).length
        if(numVal === 0) {
            return res.status(400).json({ error: `Must not be blank`})
        }

        MovieService.updateMovie(db, req.params.movie_id, req.params.user_id, updatedMovie)
            .then(movie => {
                res.status(200).json(updatedMovie)
            })
            .catch(next)
    })

这是我的电影服务:

updateMovie(db, movie_id, newMovie) {
        return db('your_movie_list').where('id', movie_id).where('user_id', user_id).update(newMovie).returning('*')
    }

应该是 2nd.all() 的问题,.all() 会捕获所有请求,无论是 GET、POST、PATCH、DELETE。 所以即使你注释掉 PATCH 代码,它也会返回 200。

将第二个.all更改为.get ,如下所示


app.use(express.json())

movieRouter
    .route('/:movie_id/:user_id')
    .all(requireAuth)
    .get((req, res, next) => { // use .get instead of .all to avoid catching all requests
        const db = req.app.get('db')
        MovieService.getById(db, req.params.movie_id, req.params.user_id)
        .then(movie => {
            if(!movie) { // this runs fine
                return res.status(404).json({ error: `Movie doesn't exist`})
            }
            res.json({movie : movie});
        })
        .catch((e) => {
            console.log("From getMovie", e); 
            res.status(400).json({ error: e.message }) 
        })
    })
    .patch((req, res, next) => { 
        try {
           const db = req.app.get('db')
           const { watched } = req.body
           const updatedMovie = { watched }

        
          // this doesn't run
          const numVal = Object.values(updatedMovie).filter(Boolean).length
          if(numVal === 0) {
              return res.status(400).json({ error: `Must not be blank`})
          }

          MovieService.updateMovie(db, req.params.movie_id, req.params.user_id, updatedMovie)
            .then(movie => {
                console.log(movie) // nothing logs 
                res.status(200).json(movie[0])
            })
            .catch((e) => {
                console.log("From updateMovie", e); 
                res.status(400).json({ error: e.message }) 
            })
         }catch(e) {
             console.log("From try/catch", e); 
             res.status(400).json({ error: e.message }) 
         }
    })

交叉检查的一个小例子

const express = require("express");
const app = express();
const PORT = process.env.PORT || 8080;
app.use(express.json())

const movieRouter = express.Router()
movieRouter
    .route('/:movie_id/:user_id')
    // .all(requireAuth)
    .get((req, res, next) => { 
        res.json({"movie:get" : 1});
    })
    .patch((req, res, next) => { 
        res.json({"movie:patch" : 1});
    })

app.use(movieRouter)

app.listen(PORT, function (err) {
  if (err) console.log(err);
  console.log("Server listening on PORT", PORT);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM