Javascript 为什么router.get(';/:x';,…)使另一个函数返回null,而router.get(';/foo/:x';,…)是绝对正确的?

Javascript 为什么router.get(';/:x';,…)使另一个函数返回null,而router.get(';/foo/:x';,…)是绝对正确的?,javascript,node.js,express,Javascript,Node.js,Express,经过几周痛苦的努力,我终于找到了问题的症结所在。我想知道的是这种行为的原因是什么。 我为我的mongodb服务器构建了一个api,就像我在学校学习的那样,使用模型、控制器和路由 在我的lobbyRoutes.js中,如果我写 router.get('/:lobbyID',controller.get) 另一个功能: router.get('/getAvailable',controller.getAvailable) -当我键入URL时将返回null(…/api/lobbies/getAvail

经过几周痛苦的努力,我终于找到了问题的症结所在。我想知道的是这种行为的原因是什么。 我为我的mongodb服务器构建了一个api,就像我在学校学习的那样,使用模型、控制器和路由

在我的lobbyRoutes.js中,如果我写
router.get('/:lobbyID',controller.get)
另一个功能:
router.get('/getAvailable',controller.getAvailable)
-当我键入URL时将返回null(…/api/lobbies/getAvailable-只返回null而不是json)

同时,如果我做一点小小的改变:
router.get('/get/:lobbyID',controller.get)(在“:lobbyID”之前添加一个“get/”将修复该问题,getAvailable将按预期返回json,而不再返回null

lobbyRoutes.js:

var controller = require('./LobbyController');
router.post('/insert',controller.insert);
router.get('/getall',controller.getall);
router.get('/get/:lobbyID',controller.get); //the one that affects
router.post('/update',controller.update);
router.post('/delete',controller.delete);
router.get('/getAvailable',controller.getAvailable); // the one that is affected
router.post('/connect',controller.connect);
router.post('/disconnect',controller.disconnect);
router.get('/getable',controller.getable);

module.exports = router;
如果有帮助,lobbyController.js:


exports.get =  function(req, res,next){
    CurrentLobby.findOne({_id:req.params.lobbyID}).then(function(data){
        res.json(data);
    },function(err){
        next(err);
    });
};


exports.getall = function(req, res, next){

    CurrentLobby.find( {} ).then(function(data){
        res.json(data)

    },
    function(err){
        next(err);
    }
    );

};

exports.getable = function(req,res,next){
    CurrentLobby.findOne({isAvailable:true}).then(function(data){
        res.json(data)
    },
    function(err)
    {
        next(err);
    });
};

exports.insert = function(req, res, next){
    var isAvailable = true;
    var playerCount = 0;
    var playerArray = [];
    var PINCODE = -1;
    var gameMode = "";
    var currentWord = "";

    var query = {title:"Index"};
    CurrentLobby.findOne({_id:"5d7a9060004a5c3318d0db98"
    }).then(function(data){
        console.log(data);
        var lobby = {title:"Lobby_"+(data.playerCount+1).toString(), isAvailable:isAvailable,playerCount:playerCount,playerArray:playerArray,PINCODE:PINCODE,gameMode:gameMode,currentWord:currentWord};
        var newItem = new CurrentLobby(lobby);
            newItem.save(function(err, item){
                if(err){
                    next(err);
                }
                res.json(item);
            });//end of save   
        CurrentLobby.findOne(query).then(function(data){
        data.playerCount++;
        data.save(function(err,item)
        {
            if(err) {next(err)};
            console.log("index incremented");
        });

        },
        function(err)
        {
            next(err);
        });
      },function(err)
      {
          next(err);
      });
    };

exports.delete =  function(req, res, next){

        CurrentPost.remove({_id:req.body._id}).then(function(){
                res.send("deleted " + req.body._id);
        }, function(err){
            next(err);
        }
        );

} ;   

exports.update = function(req, res, next){
    CurrentLobby.findOne({_id:req.query.lobbyID}).then(function(data){
        data.isAvailable = (typeof req.body.isAvailable == 'undefined') ? data.isAvailable : req.body.isAvailable;
        data.playerCount = (typeof req.body.playerCount=='undefined') ? data.playerCount : req.body.playerCount;
        data.playerArray = (typeof req.body.playerArray=='undefined') ? data.playerArray : req.body.playerArray;
        data.PINCODE = (typeof req.body.PINCODE=='undefined') ? data.PINCODE : req.body.PINCODE;
        data.gameMode = (typeof req.body.gameMode=='undefined') ? data.gameMode : req.body.gameMode;
        data.currentWord = (typeof req.body.currentWord=='undefined') ? data.currentWord : req.body.currentWord;
        data.save(function(err, item){
            if(err){
                next(err);
            }
            res.json(item);
        });

    },function(err){
        next(err);
    });
};

    exports.getAvailable=function(req,res,next)
    {
        var query = {isAvailable:true};
        CurrentLobby.findOne(query).then(function(data){
            res.json(data);
        },
        function(err){
            next(err);
        }
        );
    };

    exports.connect=function(req,res,next)
    {
        var query={_id:req.query.lobbyID}
        CurrentLobby.findOne(query).then(function(data)
        {
            console.log("called connect, user:"+req.query.userID+", lobby:"+req.query.lobbyID);
            data.isAvailable=false;
            if (typeof data.playerArr !== 'undefined' && data.playerArr.length >= 0) {
                // the array is defined and has at least one element
                data.playerArr.push(req.query.userID);
                console.log("successfully added user");
                data.playerCount++;
                if(data.playerCount==8)
                    data.isAvailable=false;
            }
            else{
                data.playerArr.push(req.query.userID);
                console.log("1st user");
            }
            data.save(function(err, item){
                if(err){
                    next(err);
                }
                res.json(item);
            });
        },
        function(err)
        {
            next(err);
        });
    };

    exports.disconnect=function(req,res,next)
    {
        var query={_id:req.query.lobbyID}   
        CurrentLobby.findOne(query).then(function(data)
        {
            console.log("called disconnect, user:"+req.query.userID+", lobby:"+req.query.lobbyID);
            data.isAvailable=false;
            if (typeof data.playerArr !== 'undefined' && data.playerArr.length >= 0) {
                // the array is defined and has at least one element
                var index = data.playerArr.indexOf(req.query.userID);
                if (index !== -1){ data.playerArr.splice(index, 1);
                console.log("successfully removed user");
                data.playerCount--;
                //room available
                if(data.playerCount==0)
                {
                    data.PINCODE=-1;
                    data.gameMode="";
                    data.currentWord="";
                    data.isAvailable=true;
                }
                }
                else{
                    console.log("not found");
                }
            }
            else console.log("array is empty");
            data.save(function(err, item){
                if(err){
                    next(err);
                }
                res.json(item);
            });
        },
        function(err)
        {
            next(err);
        });
    };

我只是想知道为什么我不能先键入一个参数(即使它不影响函数本身,只影响另一个)。谢谢。

正如用户“Mike Pomax Kamermans”所说,按顺序首先使用参数将中断所有其他路由,因此getAvailable一词将被识别为游说ID参数,而不是调用函数“getAvailable”。非常尴尬,我无法独自找出答案…

正如用户“Mike Pomax Kamermans”所说,按顺序首先使用参数将中断所有其他路由,因此getAvailable一词将被识别为游说ID参数,而不是调用函数“getAvailable”。很尴尬,我一个人想不出来……

/:某物
的意思是
/
后面跟着某个单词。除非你想打破你的其他路线,否则不要这样做。(想想如果我要求
/upload
,会发生什么情况。哪条路线会被触发?
/upload
/code>以
upload
作为参数?)啊,我想我明白了,很简单。谢谢<代码>/:某物
的意思是后面跟着某个单词。除非你想打破你的其他路线,否则不要这样做。(想想如果我要求
/upload
,会发生什么情况。哪条路线会被触发?
/upload
/code>以
upload
作为参数?)啊,我想我明白了,很简单。谢谢