2015-03-13 48 views
8

我有以下的代码,Node.js的无法解析的网址:用于node.js的请求库相对URI

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应用程序?

+1

请解释一下你的意思是“Node.js的无法解析URL”。如果您可以使用堆栈跟踪发布错误消息,那会很有帮助。 – 2015-03-13 14:00:17

回答

5

只给出一个相对url只有在从上下文清楚地知道url的根部分应该是什么时才起作用。例如,如果您位于stackoverflow.com并找到链接/questions,则从上下文可以清楚看到完整的网址应该是stackoverflow.com/questions

请求库没有这种可用的上下文信息,所以它需要你完整的url才能做出请求。您可以通过使用url.resolve()自己构建完整的URL,当然,例如:

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

当然,但是,这仍然需要你知道的URL的根部分。

2

贾斯珀的答案是正确的 - 请求模块需要完整的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            
     }; 
    })(); 

然后,抓住你需要它的基本URL随时随地:requestParser.uriMinusPath

,并抓住一个任意的查询参数的值:RequestParser.getQueryStringValue('partner_key');