Javascript 为什么router.get(';/:x';,…)使另一个函数返回null,而router.get(';/foo/:x';,…)是绝对正确的?
经过几周痛苦的努力,我终于找到了问题的症结所在。我想知道的是这种行为的原因是什么。 我为我的mongodb服务器构建了一个api,就像我在学校学习的那样,使用模型、控制器和路由 在我的lobbyRoutes.js中,如果我写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
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
作为参数?)啊,我想我明白了,很简单。谢谢