Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我的看似有效的URL在本地解析,但在heroku上部署时失败_Node.js_Heroku_Url Parsing_Node Fetch_Url Validation - Fatal编程技术网

Node.js 我的看似有效的URL在本地解析,但在heroku上部署时失败

Node.js 我的看似有效的URL在本地解析,但在heroku上部署时失败,node.js,heroku,url-parsing,node-fetch,url-validation,Node.js,Heroku,Url Parsing,Node Fetch,Url Validation,这是我关于stackoverflow的第一个问题,所以请温柔一点。我正在使用node.js构建一个简单的应用程序,它依赖于对外部地理编码服务的API调用。我的程序在本地运行,但部署到heroku时失败。以下是失败的函数: async function geoEncode(restaurant = false, string = false) { let address; address = (string) ? string : require('querystring').escape

这是我关于stackoverflow的第一个问题,所以请温柔一点。我正在使用node.js构建一个简单的应用程序,它依赖于对外部地理编码服务的API调用。我的程序在本地运行,但部署到heroku时失败。以下是失败的函数:

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密钥,但是当我获取该字符串(减去引号)并通过浏览器运行它时,它会返回有效的JSON

在部署之前,我根本没有对我的URL进行任何编码——我只是构建了一个字符串并将其提供给节点fetch模块的fetch方法。它在Heroku上出错,并显示消息“TypeError:仅支持绝对URL”。我后来了解到,这个错误消息意味着node fetch的请求方法无法解析协议或主机名。我已经设法确定,当部署到heroku上时,它无法解析这两个

我的本地环境和heroku环境的明显区别在于,我通过heroku的仪表板而不是通过.env文件设置了环境变量。因为我有点不清楚它是如何工作的,所以我最近的大部分调试一直在尝试确保提供给fetchapi的字符串采用一致、统一的编码。因此,我预先转义了我的代码,手动对其进行utf8编码,通过URL模块运行它,并将该URL编码的输出输入到函数中,而不触碰它。它仍然在本地工作,在远程发生故障

我的基本堆栈是MongoDB、Express、Node和Bootstrap。我对云MongoDB服务器的调用可以工作,对API的调用也可以工作,我从API获取地理编码数据。只有这些对我的地理编码服务的调用失败,因此我用于MongoDB连接的环境变量按预期运行

谢谢你的帮助

编辑1:

在回答下面的一条评论时(很抱歉我尝试的评论答案的格式;我现在知道标记格式在评论中是有限的),我发布的错误是使用命令“heroku logs--tail”从heroku记录的。我已经手动记录了我试图编码的URL(下面是一个已编辑的示例):

以及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)的输出并接收到以下内容时,我最终发现了问题:

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仪表板中输入被引用为geoAPI的环境变量时,我将其作为带引号的字符串输入。Heroku必须已经将环境变量键入字符串,因为结果是以“”开头和结尾的字符串,这导致url模块无法解析。当控制台记录querystring.parse(url)的输出并接收到以下内容时,我最终发现了问题:

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仪表板中的一个格式错误

我从中得到的小教训是: 不要在引号中引用环境变量。他们不是这样工作的

我从中得到的重要教训是:
当有神秘的事情发生时,尽早检查你的环境。如果您检查了它,没有发现任何东西,并且在问题上停留了很长时间,请再次检查。

我想您是将key存储为环境变量?key是地理编码API所期望的参数。我将API键存储为环境变量—事实上,我将API调用的大部分url(包括键)存储为环境变量。它在geoApi变量中引用。就我所知,它工作正常。你应该记录你的url并检查服务器日志一次(或在这里发布),也许我不清楚你的意思。我确实记录了url:url to encoded:“”并记录了收到的错误:TypeError[ERR\u INVALID\u url]:INVALID url:“”我使用命令“heroku logs--tail”检索这两个错误。这就是你的意思吗?拍摄-格式设置有问题。抱歉,如果您收到ping'd。我已经编辑了我的问题,以更全面地反映我的url日志记录的输出和错误消息。仍然不确定这是否是您的意思,但是-如果我误解了,请让我知道。我想您是将key存储为环境变量?key是地理编码API预期的参数。我