为什么我的路由在crud应用程序中发出get请求而不是post请求?

时间:2017-06-14 05:45:23

标签: node.js express crud

为什么我的路由在crud应用程序中发出get请求而不是post请求?我有一个html表单,发布到`/ api / zone'。但是,不是路由器在我的rest api中执行post函数,而是进行get调用。

这是我的表格:

    <form action="/api/zone" method="post">  <!--  The Crux of Rest API is really methods. It's a contract in REST API!-->
        <input type='text' name='name' placeholder='Name' /><br />
        <input type='text' name='zipCodes' placeholder='Zip Code' /><br />
        <input type='submit' value='Create Zone' />
    </form>

我的Api:

router.get('/:resource', function(req, res, next) {

    var resource = req.params.resource

    if (resource == 'zone'){

        ZoneController.find(req.query, function(err, results){

            if (err) {
                res.json({
                    confirmation: 'fail',
                    message: err
                })

                return
            }

            res.json({
                confirmation: 'success1234',
                results: results
            })

        });
    }

})

router.post('/:resource', function(req, res, next){

    var resource = req.params.resource

    if (resource == 'zone') {

        ZoneController.create(req.body, function(err, result){
            if (err) {
                res.json({
                     confirmation: 'fail',
                     message: 'Not Created.'
                })
                return
            }

            res.json({
                confirmation: 'success',
                results: result
            })
        })
    }

})

我有以下版本的node和express:

  

节点 - 6.11
快递 - 4.15

1 个答案:

答案 0 :(得分:0)

这是一个奇怪的问题,但我已经在Rails中看到过这种情况,我相信这就是正在发生的事情。

基本上,最初将正确的请求发送到POST,并调用正确的router.post处理程序。然而,该路由处理程序无法正确处理表单中的输入,并且由于某种原因将重定向发送到GET版本的路由(请注意,您的发布和获取路由匹配),而不是返回a,比方说400错误说它不能处理表格。

现在为什么它不能处理表单,请注意您的路由处理程序在/:resource上使用了一个slug,这意味着req.params.resource将返回一个字符串。看一下您的表单,action上指定的/api/zone就是/api/zone。所以正在发生的事情是路由器将整个字符串req.params.resource解释为slug,所以当你在post处理程序中执行api/zone时,返回的值是zone if,您有if语句检查。

这就是为什么它可能会评估else,失败,不知道该做什么并将重定向发送到GET。

因此,您可以通过对POST路由进行一些解析/验证和/或在if语句检查中添加git merge --squash develop以重定向某处或发送错误来解决此问题。

希望这有帮助!