Javascript 使用ChaiHttp发送Mapquest/googleapi密钥

Javascript 使用ChaiHttp发送Mapquest/googleapi密钥,javascript,jestjs,chai-http,Javascript,Jestjs,Chai Http,上下文:我有一个正在开发的后端API应用程序,在那里我对API进行了一系列测试。项目位于此处:。这个项目有我一直在开发的一系列测试。至于测试工具,我使用的是ChaiHttp、Jest和mongodb内存服务器。我可能应该注意到,这是我第一个真正的JavaScript项目,我正在学习测试工具 问题:所有这些都很有效。。。直到我添加了一些地理编码器功能。具体来说,我添加了节点地理编码器包 错误条件: 运行测试时,我在某些路由上遇到以下错误: OperationalError { cause: Err

上下文:我有一个正在开发的后端API应用程序,在那里我对API进行了一系列测试。项目位于此处:。这个项目有我一直在开发的一系列测试。至于测试工具,我使用的是ChaiHttp、Jest和mongodb内存服务器。我可能应该注意到,这是我第一个真正的JavaScript项目,我正在学习测试工具

问题:所有这些都很有效。。。直到我添加了一些地理编码器功能。具体来说,我添加了
节点地理编码器

错误条件:

运行测试时,我在某些路由上遇到以下错误:

OperationalError {
cause: Error: Status is REQUEST_DENIED. You must use an API key to
authenticate each request to Google Maps Platform APIs.
简要回顾一下我的逻辑:

我有一个Bootcamp模型,其中添加了geocoder逻辑。具体来说,该逻辑从请求中获取传递的
地址
,将其分解,对其进行地理编码,然后丢弃传递的
地址
,创建一个
格式化地址
。你可以看到具体情况。
节点地理编码器
本身在my中设置

正如您在我的geocoder文件中所看到的,我正在检查
geocoder\u API\u密钥
。您在repo中看不到包含此密钥的文件(我在
.gitignore
中有此密钥),但它在我的本地项目中

关键是:当我通过Postman运行API调用时,一切都正常运行。所以我知道所有的逻辑都连接好了,并且工作正常

因此,问题似乎只是在运行测试时,没有找到API密钥并将其用作请求的一部分。具体而言,是产生错误的地方:

const loc = await geocoder.geocode(this.address);
然而,除了使用内存中的mongo数据库之外,我并没有在这里嘲笑任何东西。因此,我不清楚为什么在运行测试时模型中的逻辑没有正确启动

在其他问题中,我尝试在测试中添加一行
.set
,如下所示:

chai
  .request(server)
  .post("/api/v1/bootcamps")
  .send(bootcamp)
  .set("apiKey", process.env.GEOCODER_API_KEY)
  .end((err, res) => {
    ....
const options = {
  provider: process.env.GEOCODER_PROVIDER,
  httpAdapter: "https",
  apiKey: process.env.GEOCODER_API_KEY,
  formatter: null,
};
process.env.GEOCODER_PROVIDER = "mapquest";
process.env.GEOCODER_API_KEY = "<consumer key>";
然而,这似乎并不奏效。我也犯了同样的错误

因此,我尝试输入
console.log(选项)在我的
geocoder.js
文件中。看哪,这句话的意思是:

{
   provider: undefined,
   httpAdapter: 'https',
   apiKey: undefined,
   formatter: null
}
嗯,这似乎是个问题!选项设置如下:

chai
  .request(server)
  .post("/api/v1/bootcamps")
  .send(bootcamp)
  .set("apiKey", process.env.GEOCODER_API_KEY)
  .end((err, res) => {
    ....
const options = {
  provider: process.env.GEOCODER_PROVIDER,
  httpAdapter: "https",
  apiKey: process.env.GEOCODER_API_KEY,
  formatter: null,
};
process.env.GEOCODER_PROVIDER = "mapquest";
process.env.GEOCODER_API_KEY = "<consumer key>";

因此,请注意我的
提供者
和我的
apiKey
返回时未定义,这意味着
过程。env
部分没有被正确读取或根本没有被读取。这就解释了为什么它不起作用,但它并不能解释为什么它只是在测试中不起作用。

好吧,我知道了。我的
process.env
调查结果是正确的。解决办法如下:

package.json
中,我必须添加以下内容:

  "jest": {
    "setupFiles": [
      "./config/jestVars.js"
    ]
文件位于何处或其名称无关紧要,但重要的是创建一个包含所需环境变量的文件。所以我的
jestVars.js
看起来像这样:

chai
  .request(server)
  .post("/api/v1/bootcamps")
  .send(bootcamp)
  .set("apiKey", process.env.GEOCODER_API_KEY)
  .end((err, res) => {
    ....
const options = {
  provider: process.env.GEOCODER_PROVIDER,
  httpAdapter: "https",
  apiKey: process.env.GEOCODER_API_KEY,
  formatter: null,
};
process.env.GEOCODER_PROVIDER = "mapquest";
process.env.GEOCODER_API_KEY = "<consumer key>";
process.env.GEOCODER\u PROVIDER=“mapquest”;
process.env.GEOCODER_API_KEY=“”;
一旦这些都准备好了,Jest就有了我需要的环境变量。我很不清楚为什么这是必要的,因为感觉Jest并没有实际执行项目中设置的逻辑。再说一次,这些只是变量而不是严格的逻辑,因此可能有一些潜在的原因与Jest如何与流程交互有关


不管怎么说,虽然一开始这看起来像是柴胡茶的问题,但这显然是一个笑话。

好吧,我明白了。我的
process.env
调查结果是正确的。解决办法如下:

package.json
中,我必须添加以下内容:

  "jest": {
    "setupFiles": [
      "./config/jestVars.js"
    ]
文件位于何处或其名称无关紧要,但重要的是创建一个包含所需环境变量的文件。所以我的
jestVars.js
看起来像这样:

chai
  .request(server)
  .post("/api/v1/bootcamps")
  .send(bootcamp)
  .set("apiKey", process.env.GEOCODER_API_KEY)
  .end((err, res) => {
    ....
const options = {
  provider: process.env.GEOCODER_PROVIDER,
  httpAdapter: "https",
  apiKey: process.env.GEOCODER_API_KEY,
  formatter: null,
};
process.env.GEOCODER_PROVIDER = "mapquest";
process.env.GEOCODER_API_KEY = "<consumer key>";
process.env.GEOCODER\u PROVIDER=“mapquest”;
process.env.GEOCODER_API_KEY=“”;
一旦这些都准备好了,Jest就有了我需要的环境变量。我很不清楚为什么这是必要的,因为感觉Jest并没有实际执行项目中设置的逻辑。再说一次,这些只是变量而不是严格的逻辑,因此可能有一些潜在的原因与Jest如何与流程交互有关

无论如何,虽然这一问题一开始看起来像是一个柴胡问题,但它显然是一个笑话问题