环境变量未定义在顶部定义

environment variable undefined defined at top

我有很多函数,运行 对 api 调用使用相同的 header,所以我使用了一个变量并在顶部分配了 header。

但是,return未定义 accesskey,我的程序崩溃了。所以我只是控制台记录了访问密钥以及 process.env.ACCESS_KEY,我正在获取密钥。我如何正确地将它分配给 headers object 以便它不会 return 未定义?

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;
};

首先,如果你有很多调用使用相同的header那么你可以设置一次header值,不需要在每个调用中发送headers .

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

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

App.js

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

听起来 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 也可以工作如果 process.env.ACCESS_KEY 值在AccessKey 之前被填充被使用了。

关于#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
};