上载到Zeit / Now时客户端中公开的Nuxt环境变量

时间:2019-10-10 09:11:02

标签: environment-variables nuxt dotenv zeit-now

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

然后,我将机密信息存储在Zeit / Now中,并创建了now.json以将其设置为生成和运行时,如下所示:

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

使用该设置,该构建仅适用于索引页面,并且所有Javascript均不起作用。仅当我将环境属性添加到nuxt.config.js文件时,该应用程序才能在Zeit服务器上正常运行。

require('dotenv').config()

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

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

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

2 个答案:

答案 0 :(得分:1)

您在这里不一定做错任何事情,这就是Nuxtjs的工作方式。在env属性中声明的变量用于替换process.env.MY_ENV的实例,但是由于Nuxt是同构的,因此可以在服务器和 client 上使用。

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

  

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

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

很明显,这意味着这些机密将无法在客户端使用,但是如果您具有诸如Stripe机密密钥之类的东西需要进行后端请求,则可以使用此机密。

答案 1 :(得分:1)

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

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

然后我们注意到.env变量没有公开。

我希望它能帮上忙。

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

另外,在here上进行了一些讨论。