簡體   English   中英

我看似有效的 URL 在本地解析,但在 heroku 上部署時失敗

[英]My seemingly valid URLs parse locally but fail when deployed on heroku

這是我關於stackoverflow的第一個問題,所以請溫柔一點。 我正在使用 node.js 構建一個簡單的應用程序,該應用程序依賴於對外部地理編碼服務的 API 調用。 我的程序在本地運行,但在部署到 heroku 時失敗。 這是失敗的 function:

async function geoEncode(restaurant = false, string = false) {
  let address;
  address = (string) ? string : require('querystring').escape(`${restaurant.street_address}, ${restaurant.city_state_zip}, ${restaurant.state}, ${restaurant.zip}`);
  let url = await geoApi.replace("SEARCH_STRING", address);
  let encodedURL = new URL(url);
  let init = {};
  let headers = {
    "async": true,
    "crossDomain": true,
    "method": "GET",
    "Host": "us1.locationiq.com",
  }
  init.headers = headers;
  try {
    let response = await fetch(encodedURL.href, init);
    let output = await response.json();
    return output;
  } catch(err){
    console.log("this log an error in geoEncode", err);
  }
}

我認識到這段代碼目前是一堆不必要的編碼和冗余標頭。 我失敗的調試過程的副作用。 在本地運行時,程序會向服務發送有效的 url 並返回響應數據。 當部署在 heroku 上時,

let encodedURL = new URL(url);

投擲

TypeError [ERR_INVALID_URL]: Invalid URL: "https://us1.locationiq.com/v1/search.php?key ...

我已經為我的問題編輯了這個 url 以保護 API 密鑰,但是當我獲取該字符串(減去引號)並通過我的瀏覽器運行它時,它返回有效的 Z0ECD11C1D7A287401D148A23BBD7A2F。

在部署之前,我根本沒有對我的 url 進行任何編碼 - 我只是構建了一個字符串並將其提供給 node-fetch 模塊的 fetch 方法。 它在 Heroku 上出錯,並顯示消息“TypeError:僅支持絕對 URL”。 從那以后,我了解到此錯誤消息意味着 node-fetch 的請求方法無法解析協議或主機名。 我已經設法確定,當部署在 heroku 上時,它無法解析兩者。

我的本地環境和 heroku 的明顯區別在於我通過 heroku 的儀表板而不是通過 my.env 文件設置了環境變量。 因為我有點不清楚它是如何工作的,所以我最近的大部分調試都試圖確保我提供給 fetch API 的字符串是一致的、統一的編碼。 因此,我已經預先轉義了我的代碼,手動對其進行了 utf8 編碼,通過 URL 模塊運行它,並將該 url 編碼的 output 輸入到 ZC1C425268E68385D1AB5074F 中。 它仍然在本地工作並在遠程失敗。

我的基本堆棧是 MongoDB、Express、Node、Bootstrap。 我對我的雲 MongoDB 服務器的調用工作,對 API 的調用也是如此,我從中獲取我進行地理編碼的數據。 只有這些對我的地理編碼服務的調用失敗,所以我用於 MongoDB 連接的環境變量按預期運行。

謝謝你的幫助!

編輯1:

為了回答下面的評論(對我嘗試的評論答案的格式感到抱歉;我現在知道 markdown 格式在評論中受到限制),我發布的錯誤是使用命令“heroku logs --tail”從 heroku 記錄的。 我已經手動記錄了我正在嘗試編碼的 URL(以下是一個經過編輯的示例):

URL to be encoded: "https://us1.locationiq.com/v1/search.php?key=KEY-REDACTED&format=json&q=101%20NICKERSON%20ST%2C%20SEATTLE%2C%20WA%2C%2098109-1654"

以及報告的錯誤 heroku :

TypeError [ERR_INVALID_URL]: Invalid URL: "https://us1.locationiq.com/v1/search.php?key=KEY-REDACTED=json&q=101%20NICKERSON%20ST%2C%20SEATTLE%2C%20WA%2C%2098109-1654"

編輯2:

我想我可能沒有在我的帖子中提供足夠的錯誤日志記錄。 這是更完整的錯誤日志。 我希望這對可以反過來幫助我的人有所幫助。

2019-11-14T23:35:09.646585+00:00 app[web.1]: (node:23) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_URL]: Invalid URL: "https://us1.locationiq.com/v1/search.php?key=KEY_REDACTED&format=json&q=101%20NICKERSON%20ST%2C%20SEATTLE%2C%20WA%2C%2098109-1654"
2019-11-14T23:35:09.646591+00:00 app[web.1]: at onParseError (internal/url.js:243:9)
2019-11-14T23:35:09.646593+00:00 app[web.1]: at new URL (internal/url.js:319:5)
2019-11-14T23:35:09.646595+00:00 app[web.1]: at geoEncode (/app/server.js:308:20)
2019-11-14T23:35:09.646599+00:00 app[web.1]: at processTicksAndRejections (internal/process/task_queues.js:93:5)
2019-11-14T23:35:09.646602+00:00 app[web.1]: at async Timeout._onTimeout (/app/server.js:373:29)

解決了,答案是可以預見的沉悶:但這里是:

當我在 heroku 儀表板中輸入引用為 geoAPI 的環境變量時,我將其作為帶引號的字符串輸入。 Heroku 必須已經將環境變量鍵入為字符串,因為結果是以“”開頭和結尾的字符串,這導致 url 模塊無法解析。 當我在控制台記錄 querystring.parse(url) 的 output 並收到:

parsed querystring: [Object: null prototype] {
2019-11-19T21:54:59.724380+00:00 app[web.1]: '"https://us1.locationiq.com/v1/search.php?key': 'REDACTED',
2019-11-19T21:54:59.724382+00:00 app[web.1]: format: 'json',
2019-11-19T21:54:59.724385+00:00 app[web.1]: q: '101 NICKERSON ST, SEATTLE, WA, 98109-1654"' }

顯然,額外的引號使第一個“=”之前的所有內容都被讀作鍵。 這就是我發現額外引號的方式。 刪除多余的引號解決了這個問題。 很高興它結束了,但遺憾的是它只是 heroku 儀表板中的格式錯誤。

我從中得到的小教訓:不要將 heroku 環境變量放在引號中。 他們不是這樣工作的。

我從中得到的重要教訓:當某些事情很神秘時,請盡早檢查您的環境。 如果你檢查它,沒有發現任何東西,並且長時間停留在問題上,請再次檢查它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM