我正在与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文件时,我的秘密被暴露了,这显然是我不想要的。
我在这里做错了什么?感谢您的帮助。
答案 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上进行了一些讨论。