Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无论发生什么情况,节点JS补丁请求都在运行_Javascript_Node.js_Express_Patch - Fatal编程技术网

Javascript 无论发生什么情况,节点JS补丁请求都在运行

Javascript 无论发生什么情况,节点JS补丁请求都在运行,javascript,node.js,express,patch,Javascript,Node.js,Express,Patch,对不起,如果标题让人困惑,我不太确定该怎么说。我有一个补丁请求更新数据库中的一个值,但即使它正在“工作”(200状态),实际上也不是。 我有一个.route('/:movie\u id/:user\u id').all()处理程序来触发我的所有方法,它通过movie\u id和user\u id从数据库中提取一部电影。这很有效。然后我继续我的补丁请求,但是看起来补丁请求实际上没有运行。我正在从.all()处理程序获得正确的响应,但没有发生更新。即使我完全注释掉了我的补丁的代码,我的状态仍然是20

对不起,如果标题让人困惑,我不太确定该怎么说。我有一个补丁请求更新数据库中的一个值,但即使它正在“工作”(200状态),实际上也不是。 我有一个
.route('/:movie\u id/:user\u id').all()
处理程序来触发我的所有方法,它通过movie\u id和user\u id从数据库中提取一部电影。这很有效。然后我继续我的补丁请求,但是看起来补丁请求实际上没有运行。我正在从.all()处理程序获得正确的响应,但没有发生更新。即使我完全注释掉了我的补丁的代码,我的状态仍然是200

下面是我的.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('*')
    }

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

将第二个
.all
更改为
。获取
如下所示


app.use(express.json())
电影制作人
.route(“/:movie\u id/:user\u id”)
.all(需要授权)
.get((req,res,next)=>{//使用.get代替.all以避免捕获所有请求
const db=req.app.get('db')
MovieService.getById(db,req.params.movie\u id,req.params.user\u id)
.然后(电影=>{
如果(!movie){//运行正常
返回res.status(404).json({错误:`Movie不存在`})
}
res.json({movie:movie});
})
.catch((e)=>{
日志(“来自getMovie”,e);
res.status(400).json({error:e.message})
})
})
.patch((请求、恢复、下一个)=>{
试一试{
const db=req.app.get('db')
const{wasted}=req.body
const updatemovie={wasted}
//这个不能运行
const numVal=Object.values(updateMovie).filter(Boolean).length
如果(numVal==0){
返回res.status(400).json({错误:`不能为空`})
}
MovieService.updateMovie(db,req.params.movie_id,req.params.user_id,updateMovie)
.然后(电影=>{
console.log(movie)//没有任何日志
res.status(200.json)(电影[0])
})
.catch((e)=>{
log(“来自updateMovie”,e);
res.status(400).json({error:e.message})
})
}捕获(e){
console.log(“来自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);
});

我知道这是一个非常晚的答复,但我做了你的建议,现在我的补丁请求只是继续运行。Postman说“发送请求”,我不得不取消它。所以updateMovie方法中一定有什么错误,它是catch,然后执行,但是next没有指向任何东西,所以它将变成黑洞。您可以尝试将.catch更改为
.catch((e)=>{console.log(e);res.status(400).json({error:e.message})})
。还更新了我的答案。添加了try/catch来包装整个代码块,因为在获取和处理req.body时可能也有错误。我确实尝试了,但由于请求未通过,所以我没有获得任何日志。好像还没过第一关