2015-03-13 60 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');