4

对于我的应用程序,我设置了两条路线,

app.get('/', routes.index);
app.get('/:name', routes.index);

我希望它是这样的,如果我不指定一个参数,说只是去 appurl.com (localhost:3000),它会加载一个默认用户,但如果我指定一个参数(localhost:3000/user ),将其用作以下函数中的变量“用户名”(放置在我的路线之后)。

(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 吐出“用户名”,所以分配它没有问题,但由于我是 expressjs 的新手,我不知道我应该如何去做。我已经尝试了所有我能想到的并通过浏览互联网找到的东西。

另外,如果有更好的方法,或者我做错了什么,请告诉我。如果我遗漏了任何信息,请发表评论,我会尝试解决它。

4

3 回答 3

2

是否可以设置两条不同的路线 - 一条用于根目录,一条用于提供的名称?由于它路由到两个不同的函数,因此您可以控制通过默认的“/”路由设置默认值或通过传入的 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...
};
于 2012-08-29T02:37:46.133 回答
1

如果即时函数调用getUser()真正“在”您的路由之后,它将在启动时调用一次,在您处理任何请求之前。我猜你想这样做一次以建立一个默认设置,artist如果用户没有在他们的请求中提供一个名称。

如果是这样,您需要重写getUser()以将用户名和回调作为参数,并使用您当前分配给的值调用回调artist。在初始化时,使用您想用作默认用户名的任何用户名和仅设置的回调调用它artist。然后按照 bryanmac 建议的方式拆分您的路线,使用artistinhome()并调用getUser()in getNamed()

于 2012-08-29T03:33:57.213 回答
-2

不确定我是否理解你的问题。

app.get('/', function(req, res){
  res.redirect('appurl.com');
});

app.get('/:name', routes.index);
于 2012-08-29T02:43:39.713 回答