当将next.js与环境变量一起使用时,为什么我的API密钥可见?

问题描述 投票:2回答:1

我遵循next.js文档,并在now服务器上添加了自定义api密钥。

问题是,当我运行now dev并转到“源”选项卡时,可以在此处看到我的api密钥。

enter image description here

api密钥保存在.env.build文件中,这是我的代码:

index.js

import { useState, useEffect } from 'react';
const axios = require('axios');

import Nav from '../src/components/Nav';
import Head from '../src/components/Head';
import Movies from '../src/components/movies';

const key = process.env.API_KEY;

const index = () => {
  const [currentMovies, setCurrentMovies] = useState([]);

  const getTopMovies = async url => {
    const fetchData = await axios.get(url).then(response => {
      const [...data] = response.data.results;
      setCurrentMovies({ data: data });
    });
  };

  useEffect(() => {
    getTopMovies(
      `https://api.themoviedb.org/3/discover/movie?primary_release_date.gte=2019-12-12&primary_release_date.lte=2020-02-22&api_key=${key}`
    );
  }, []);

  if (currentMovies.data === undefined) {
    console.log('Loading...');
  } else {
    console.log(currentMovies.data);
  }

next.config.js

module.exports = {
  env: {
    API_KEY: process.env.API_KEY
  }
};

now.config.json

{
  "build": {
    "env": {
      "API_KEY": "@api-key-moviedb"
    }
  }
}
javascript reactjs api environment-variables next.js
1个回答
3
投票

NextJS使用Webpack中的DefinePlugin实现环境变量。在编译时,process.env中使用的所有变量都将替换为.env中的变量。从文档:

Next.js在build时将process.env.customKey替换为'my-value'。

与服务器端不同,NextJS仍然是用于在浏览器中运行JavaScript的客户端框架,并且就目前而言,没有办法从浏览器中隐藏这些键。

如果必须隐藏密钥,则必须添加服务器(或无服务器功能)。

您可以添加一个API端点并从前端调用它,该端点将连接到第三方服务并返回获取的数据。

执行此操作的方法之一是添加.env并使用dotenv将其加载到Node进程中。

。env

API_KEY=@api-key-moviedb

next.config.js

require('dotenv').config();

module.exports = {
  /* config options here */
};

用法

process.env.API_KEY

这样您的API密钥将不会被公开。

Next.js with dotenv example

API routes in Next.js

© www.soinside.com 2019 - 2024. All rights reserved.