对于我的应用程序,我有两个路由设置,
app.get('/', routes.index);
app.get('/:name', routes.index);
我希望它是这样的,如果我没有指定一个参数,比如说去appurl.com(localhost:3000),它会加载一个默认用户,但如果我确实指定了一个参数(localhost: 3000 / user),在下面的函数中使用它作为变量“username”(放在我的路径之后)。
(function getUser(){
var body = '',
username = 'WillsonSM',
options = {
host: 'ws.audioscrobbler.com',
port: 80,
path: '/2.0/?method=user.gettopartists&user=' + username + '&format=json&limit=20&api_key=APIKEYGOESHERE'
};
require('http').request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
body = JSON.parse(body);
artists = body.topartists.artist;
});
}).end();
})();
除此之外,我的路线设置如下:
exports.index = function(req, res){
res.render('index', { title: 'LasTube' });
username = req.params.name;
console.log(username);
};
很遗憾,将用户名设置为req.params.name
似乎无法从主应用功能访问。
我的问题是:如何设置expressjs / nodejs以在可用时通过/ name使用参数集,并使用默认值 - 在此示例中为“WillsonSM”(如果不可用)。
我已经尝试从主应用程序中取出“用户名”,只是将其保留在函数中,但用户名变为未定义,因为它无法从路径中访问,并且应用程序将无法运行。我可以通过路由console.log吐出“用户名”,所以在那里分配它没有问题,但由于我是表达新手,我不知道我应该怎么做。我已经尝试了所有我能想到的东西,并通过浏览互联网找到了。
另外,如果有更好的方法,或者我做错了,请告诉我。如果我遗漏了任何信息,只需发表评论,我会尽力解决。
答案 0 :(得分:2)
是否可以设置两个不同的路径 - 一个用于root,一个用于提供的名称?由于它路由到两个不同的函数,您可以通过默认的'/'路由控制设置默认值,或者通过传入的url获取:name(:name变为req.params.name)。
app.get('/', routes.home);
app.get(':name', routes.getNamed);
路线:
exports.home = function(req, res) {
username = "defaultUser";
// etc...
};
exports.getNamed = function (req, res) {
username = req.params.name;
// etc...
};
答案 1 :(得分:1)
如果对getUser()
的立即函数调用确实在您的路线“之后”,则在您处理任何请求之前,它将在启动时被调用一次。我猜你想要这样做一次就建立一个artist
的默认设置,如果用户没有在他们的请求中提供一个名字就会使用它。
如果是这样,您需要重写getUser()
以将用户名和回调作为参数,并使用您当前分配给artist
的值调用回调。在初始化时,使用您要用作默认的任何用户名和仅设置artist
的回调来调用它。然后使用artist
中的home()
并在getUser()
中拨打getNamed()
,按照bryanmac建议的方式拆分路线。
答案 2 :(得分:-2)
不确定我理解你的问题。
app.get('/', function(req, res){
res.redirect('appurl.com');
});
app.get('/:name', routes.index);