node.js请求库的相对uri

时间:2015-03-13 06:44:42

标签: javascript node.js express

我有以下代码,node.js无法解析网址:

const request = require('request')
const teamURL = `/users/${user._id}/teams`;

const req = request({
    url: teamURL,
    json: true
 }, 
 function(error, response, body) {

    if (!error && response.statusCode == '200') {

        res.render('userHome.html', {
            user: user,
            teams: body
        });
    } 
    else {
        console.error(error);
        next(error);
    }
});

有一种很好的方法可以在服务器端node.js Express app上使用相对路径/ url和请求库吗?

2 个答案:

答案 0 :(得分:5)

仅仅从上下文中清楚地知道url的根部应该是什么,只提供一个相对URL。例如,如果您在stackoverflow.com并找到了/questions链接,则从上下文中可以清楚地看到完整网址应为stackoverflow.com/questions

请求库没有这种上下文信息可用,因此需要您提供的完整URL才能发出请求。您当然可以自己构建完整的URL,例如使用url.resolve()

var url = require('url');
var fullUrl = url.resolve('http://somesite.com', '/users/15/teams');
console.log(fullUrl); //=> 'http://somesite.com/users/15/teams');

但当然这仍然需要你知道网址的根部分。

答案 1 :(得分:2)

Jasper的回答是正确的 - 请求模块需要完整的URL。如果您遇到单页应用程序,并且对具有相同基本URL的API提出了大量请求,则可以通过创建如下模块来节省大量输入:

    var url = require('url'); 

    var requestParser = (function() {
      var href = document.location.href;
      var urlObj = url.parse(href, true);

      return { 
        href,
        urlObj,
        getQueryStringValue: (key) => {
          let value = ((urlObj && urlObj.query) && urlObj.query[key]) || null;
          return value;
        },
        uriMinusPath: urlObj.protocol + '//' + urlObj.hostname                                               
      };  
    })();

然后,在您需要时随时获取基本网址:requestParser.uriMinusPath

并获取任意查询参数的值:RequestParser.getQueryStringValue('partner_key');