【问题标题】:environment variable undefined defined at top顶部未定义的环境变量
【发布时间】:2022-01-23 00:47:46
【问题描述】:

我有许多运行的函数对 api 调用使用相同的标头,因此我使用了一个变量并在顶部分配了标头。

但是,它返回未定义的访问键,我的程序崩溃了。所以我只是控制台记录了访问密钥以及process.env.ACCESS_KEY,我得到了密钥。如何正确地将它分配给 headers 对象,以便它不会返回未定义?

import axios from 'axios';

const headers = {
  Accept: 'application/json',
  'Content-Type': 'application/json',
  AccessKey: process.env.ACCESS_KEY,
};

const createMan = async (name: string) => {
  const body = JSON.stringify({
    Name: name,
  });
  const resp = await axios.post('https://example.com', body, {
    headers,
  });
  console.log(headers)//AcccessKey is undefined in the headers object
  console.log(process.env.ACCESS_KEY) //shows the access key. How?
  
  return id;
};

【问题讨论】:

  • 它必须分配到 else where 但它不会自动更新 headers 对象。
  • 对不起,我没有找到你@DanielA.White。你的意思是const headers 可能分配到别处?或access_key?
  • process.env.ACCESS_KEY
  • 看到了吗?这就是问题所在,它在开始时是未定义的,后来在某些时候被定义,在某些你没有在这里显示的代码中
  • 这种问题。至少您应该尝试逐步使用调试器来检查值以查看标头在此过程中如何变化。然后,您可能很容易发现导致问题的代码行。

标签: javascript node.js express environment-variables


【解决方案1】:

听起来process.env.ACCESS_KEY 稍后被添加到process.env(可修改)中,其他代码未显示,而不是在进程启动时由 Node.js 设置。解决此问题的三种方法:

  1. 让其他代码也更新headers。

  2. 将AccessKey 设为每次使用时都会从process.env.ACCESS_KEY 检索的访问器属性:

    const headers = {
        Accept: "application/json",
        "Content-Type": "application/json",
        get AccessKey() { return process.env.ACCESS_KEY; })
    };
    
  3. 有一个模块,A) 获取访问密钥(但分配给 process.env.ACCESS_KEY)和 B) 创建并导出 Axios 实例。 (更多下文。)

如果可能,我会使用 #1 或 #3,但 #2 也可以使用如果在使用 AccessKey 之前填充了 process.env.ACCESS_KEY 值。

更多关于#3:

Axios 有一个有用的功能,您可以在其中创建一个预先配置修改默认值的 实例,因此您不必在每次调用时都指定这些默认值。它看起来像这样(来自the documentation):

const instance = axios.create({
    baseURL: "https://some-domain.com/api/",
    timeout: 1000,
    headers: {"X-Custom-Header": "foobar"}
});

因此,无论您当前拥有设置process.env.ACCESS_KEY 的任何代码,您都可以这样做:

const accessKey = codeThatGetsTheAccessKey();
export const myAxios = axios.create({
    headers: {
       Accept: "application/json",
       "Content-Type": "application/json",
       AccessKey: accessKey,
    }
});

然后,您将导入该 Axios 实例(而不是使用全局实例)并使用它

import { myAxios } from "./your-module.js";

const createMan = async (name: string) => {
    const body = JSON.stringify({
        Name: name,
    });
    const resp = await myAxios.post("https://example.com", body);
    return id; // ??? I'm not sure where this came from
};

【讨论】:

    【解决方案2】:

    首先,如果您有许多调用使用相同的标头,因此您可以设置一次标头值,则无需在每次调用中发送标头。

    axios.defaults.headers.common['AccessKey'] = process.env.ACCESS_KEY;
    

    如果您没有从环境变量中获得价值,请使用 https://www.npmjs.com/package/dotenv

    App.js

    require('dotenv').config() // import at the top
    

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2020-08-09
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2019-08-25
      相关资源
      最近更新 更多