节点 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 状态。

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

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('*')
    }

应该是第2个.all()的问题,.all()会捕获所有请求,不管是GET,POST,PATCH,DELETE。所以即使你注释掉 PATCH 代码,它也会 return 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);
});