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