我有以下代码,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和请求库吗?
答案 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');