在Expressjs中,将路由参数作为变量传递给主应用程序

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输出“username”,因此在那里分配它不是问题,但是由于我是expressjs的新手,我不知道应该如何处理这个问题。我已经尝试了我能想到的和从互联网上找到的所有方法。

另外,如果有更好的方法或者我做错了什么,请告诉我。如果我遗漏了任何信息,请留下评论,我会尽力解决。

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...
};

谢谢你的帮助,我通过你和ebohlman的回答解决了问题。 - MoDFoX

1
如果对getUser()的立即函数调用确实是在您的路由之后,那么它将在处理任何请求之前在启动时被调用一次。我猜想您想这样做是为了建立一个默认设置,以便在用户没有在请求中提供名称时使用。artist 如果是这样,您需要重新编写getUser()以接受用户名和回调作为参数,并使用您当前分配给artist的值调用回调函数。在初始化时,使用您想要用作默认值的任何用户名和仅设置artist的回调来调用它。然后按照bryanmac的建议拆分您的路由,使用home()中的artist并在getNamed()中调用getUser()

谢谢!经过一些摸索和学习,我能够从你说的话中找到答案。已标记为答案。 - MoDFoX

-2

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接