6

我正在使用 Zeit/Now 部署 Nuxt 应用程序。在开发阶段,我使用一个.env文件将秘密存储到我的 Contentful CMS 中,process.env并使用 nuxt-dotenv 包公开这些秘密。为此,在我调用的 nuxt.config 顶部require('dotenv').config()

然后我用 Zeit/Now 存储了这些秘密,并创建了一个 now.json 来为构建和运行时设置它们,如下所示:

{
    "env": {
        "DEMO_ID": "@demo_id"
    },
    "build": {
        "env": {
          "DEMO_ID": "@demo_id"
        }
    }
}

使用该设置,构建仅适用于索引页面,并且所有 Javascript 都不起作用。只有当我将 env-property 添加到nuxt.config.js文件中时,该应用程序才开始在 Zeit-server 上正常工作。

require('dotenv').config()

export default {
...
env: {
   DEMO_ID: process.env.DEMO_ID
  },
...
  modules: [
    '@nuxtjs/dotenv'
  ],
...
}

但是:当我检查上传的 Javascript 文件时,我的秘密被暴露了,这显然是我不想要的。

我在这里做错了什么?谢谢你的帮助。

4

2 回答 2

3

你不一定在这里做错了什么,这正是 Nuxtjs 的工作原理。

属性中声明的变量env用于替换 的实例process.env.MY_ENV,但由于 Nuxt 是同构的,这可以在服务器和客户端上。

如果您希望这些机密只能在服务器上访问,那么解决此问题的最简单方法是使用serverMiddleware.

由于 serverMiddleware 与主要的 Nuxt 构建分离,因此 nuxt.config.js 中定义的 env 变量在那里不可用。

这意味着您的正常 ENV 变量应该可以访问,因为服务器中间件在 Node.js 上运行。

显然,这意味着这些秘密在客户端将不可用,但如果您有类似 Stripe 密钥之类的东西需要用于发出后端请求,则此方法有效。

于 2019-10-10T16:24:45.027 回答
1

我们的项目中有类似的问题。甚至,我们从头开始创建了一个 nuxt 项目并检查是否有我们跳过的情况。我们注意到,在构建 nuxt 时,它会将 .env 变量复制到 nuxt 文件夹中的 utils.js 中。通过此处的文档,我们将 nuxt.config.js 中的 modules 部分更改如下,

modules: ['@ nuxtjs / apollo', '@ nuxtjs / axios', ['@ nuxtjs / dotenv', { only: ['']}]],

然后我们注意到 .env 变量没有暴露。

我希望它有所帮助。

我们的 nuxt 版本是“nuxt”:“^ 2.13.0”。

另外,这里有一些讨论。

于 2020-07-28T11:22:24.943 回答