环境变量不起作用(Next.JS 9.4.4)
Environment variables not working (Next.JS 9.4.4)
所以我正在使用 Contentful API 从我的帐户中获取一些内容并将其显示在我的 Next.Js 应用程序中(我正在使用下一个 9.4.4)。这里很基本。现在为了保护我的凭据,我想使用环境变量(我以前从未使用过它,而且我对所有这些都不熟悉,所以我有点迷路了)。
我正在使用以下内容在我的 index.js 文件中创建内容客户端:
const client = require('contentful').createClient({
space: 'MYSPACEID',
accessToken: 'MYACCESSTOKEN',
});
MYSPACEID
和 MYACCESSTOKEN
是硬编码的,所以我想将它们放在一个 .env 文件中以保护它,并且在 Vercel 上部署时不要使其成为 public .
我创建了一个 .env
文件并像这样填充它:
CONTENTFUL_SPACE_ID=MYSPACEID
CONTENTFUL_ACCESS_TOKEN=MYACCESSTOKEN
当然,MYACCESSTOKEN
和MYSPACEID
包含正确的键。
然后在我的 index.js 文件中,我执行以下操作:
const client = require('contentful').createClient({
space: `${process.env.CONTENTFUL_SPACE_ID}`,
accessToken: `${process.env.CONTENTFUL_ACCESS_TOKEN}`,
});
但是当我使用 yarn dev
时它不起作用,我收到以下控制台错误:
{
sys: { type: 'Error', id: 'NotFound' },
message: 'The resource could not be found.',
requestId: 'c7340a45-a1ef-4171-93de-c606672b65c3'
}
这是我的主页以及我如何从 Contentful 检索内容并将它们作为 props 传递给我的组件:
const client = require('contentful').createClient({
space: 'MYSPACEID',
accessToken: 'MYACCESSTOKEN',
});
function Home(props) {
return (
<div>
<Head>
<title>My Page</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main id="page-home">
<Modal />
<NavTwo />
<Hero item={props.myEntries[0]} />
<Footer />
</main>
</div>
);
}
Home.getInitialProps = async () => {
const myEntries = await client.getEntries({
content_type: 'mycontenttype',
});
return {
myEntries: myEntries.items
};
};
export default Home;
你认为我的错误来自哪里?
研究我的问题,我也试图了解 api
在 next.js 中的工作原理,因为我读过在 [=] 中创建 api 请求可能会更好24=] 但我不明白如何获取内容然后将响应传递到我的页面组件中,就像我在这里做的那样..
如有任何帮助,我们将不胜感激!
编辑:
所以我通过将我的环境变量添加到我的 next.config.js
来解决这个问题,就像这样:
const withSass = require('@zeit/next-sass');
module.exports = withSass({
webpack(config, options) {
const rules = [
{
test: /\.scss$/,
use: [{ loader: 'sass-loader' }],
},
];
return {
...config,
module: { ...config.module, rules: [...config.module.rules, ...rules] },
};
},
env: {
CONTENTFUL_SPACE_ID: process.env.CONTENTFUL_SPACE_ID,
CONTENTFUL_ACCESS_TOKEN: process.env.CONTENTFUL_ACCESS_TOKEN,
},
});
参考docs
您需要在项目中添加一个 next.config.js 文件。在该文件中定义环境变量,这些变量将在您的应用程序中可用。
如果不公开您的 API 凭据,您将无法从客户端发出此类请求。你必须有一个后端。
您可以使用 Next.js /pages/api
向 Contentful 发出请求,然后将其传递给您的前端。
只需创建一个 .env
文件,添加变量并在您的 API 路由中引用它,如下所示:
process.env.CONTENTFUL_SPACE_ID
从 Next.js 9.4 开始,您不需要 next.config.js。
通过将变量添加到 next.config.js
,您已将秘密 暴露给客户端。任何人都可以看到这些秘密。
New Environment Variables Support
Create a Next.js App with Contentful and Deploy It with Vercel
npm i --save dotenv-webpack@2.0.0 // version 3.0.0 has a bug
在根目录中创建 .env.development.local
文件。并在此处添加您的环境变量:
AUTH0_COOKIE_SECRET=eirhg32urrroeroro9344u9832789327432894@@@
NODE_ENV=development
AUTH0_NAMESPACE=https:ilmrerino.auth0.com
在您的应用程序的根目录中创建 next.config.js
。
const Dotenv = require("dotenv-webpack");
module.exports = {
webpack: (config) => {
config.resolve.alias["@"] = path.resolve(__dirname);
config.plugins.push(new Dotenv({ silent: true }));
return config;
},
};
但是这些环境变量将被服务器访问。如果你想使用任何环境变量,你必须再添加一个配置。
module.exports = {
webpack: (config) => {
config.resolve.alias["@"] = path.resolve(__dirname);
config.plugins.push(new Dotenv({ silent: true }));
return config;
},
env: {
AUTH0_NAMESPACE: process.env.AUTH0_NAMESPACE,
},
};
不要 把敏感的东西放在 next.config.js
但是 在我的例子中我有一些不是的环境变量非常敏感,我需要服务器端和客户端,然后你可以这样做:
// .env file:
VARIABLE_X=XYZ
// next.config.js
module.exports = {
env: {
VARIABLE_X: process.env.VARIABLE_X,
},
}
我建议在 nextjs 9.4 及更高版本上更新,使用此示例:
.env.local
NEXT_PUBLIC_SECRET_KEY=i7z7GeS38r10orTRr1i
并且在您的代码的任何部分,您可以使用:
.js
const SECRET_KEY = process.env.NEXT_PUBLIC_SECRET_KEY
note that it must be the same name of the key "NEXT_PUBLIC_ SECRET_KEY" and not only "SECRET_KEY"
当你 运行 它确保在日志中说
$ next dev
Loaded env from E:\awesome-project\client\.env.local
ready - started server on http://localhost:3000
...
要了解有关环境变量的更多信息,请参阅 this link
如果您使用的是最新版本的 nextJs(9 以上)
然后按照以下步骤操作:
- Create a .env.local file in the root of the project.
- Add the prefix NEXT_PUBLIC_ to all of your environment variables.
eg: NEXT_PUBLIC_SOMETHING=12345
- use them in any JS file like with prefix process.env
eg: process.env.NEXT_PUBLIC_SOMETHING
您必须在 next.config.js
中进行简单的更改
const nextConfig = {
reactStrictMode: true,
env:{
MYACCESSTOKEN : process.env.MYACCESSTOKEN,
MYSPACEID: process.env.MYSPACEID,
}
}
module.exports = nextConfig
改成这样
所以我正在使用 Contentful API 从我的帐户中获取一些内容并将其显示在我的 Next.Js 应用程序中(我正在使用下一个 9.4.4)。这里很基本。现在为了保护我的凭据,我想使用环境变量(我以前从未使用过它,而且我对所有这些都不熟悉,所以我有点迷路了)。
我正在使用以下内容在我的 index.js 文件中创建内容客户端:
const client = require('contentful').createClient({
space: 'MYSPACEID',
accessToken: 'MYACCESSTOKEN',
});
MYSPACEID
和 MYACCESSTOKEN
是硬编码的,所以我想将它们放在一个 .env 文件中以保护它,并且在 Vercel 上部署时不要使其成为 public .
我创建了一个 .env
文件并像这样填充它:
CONTENTFUL_SPACE_ID=MYSPACEID
CONTENTFUL_ACCESS_TOKEN=MYACCESSTOKEN
当然,MYACCESSTOKEN
和MYSPACEID
包含正确的键。
然后在我的 index.js 文件中,我执行以下操作:
const client = require('contentful').createClient({
space: `${process.env.CONTENTFUL_SPACE_ID}`,
accessToken: `${process.env.CONTENTFUL_ACCESS_TOKEN}`,
});
但是当我使用 yarn dev
时它不起作用,我收到以下控制台错误:
{
sys: { type: 'Error', id: 'NotFound' },
message: 'The resource could not be found.',
requestId: 'c7340a45-a1ef-4171-93de-c606672b65c3'
}
这是我的主页以及我如何从 Contentful 检索内容并将它们作为 props 传递给我的组件:
const client = require('contentful').createClient({
space: 'MYSPACEID',
accessToken: 'MYACCESSTOKEN',
});
function Home(props) {
return (
<div>
<Head>
<title>My Page</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main id="page-home">
<Modal />
<NavTwo />
<Hero item={props.myEntries[0]} />
<Footer />
</main>
</div>
);
}
Home.getInitialProps = async () => {
const myEntries = await client.getEntries({
content_type: 'mycontenttype',
});
return {
myEntries: myEntries.items
};
};
export default Home;
你认为我的错误来自哪里?
研究我的问题,我也试图了解 api
在 next.js 中的工作原理,因为我读过在 [=] 中创建 api 请求可能会更好24=] 但我不明白如何获取内容然后将响应传递到我的页面组件中,就像我在这里做的那样..
如有任何帮助,我们将不胜感激!
编辑:
所以我通过将我的环境变量添加到我的 next.config.js
来解决这个问题,就像这样:
const withSass = require('@zeit/next-sass');
module.exports = withSass({
webpack(config, options) {
const rules = [
{
test: /\.scss$/,
use: [{ loader: 'sass-loader' }],
},
];
return {
...config,
module: { ...config.module, rules: [...config.module.rules, ...rules] },
};
},
env: {
CONTENTFUL_SPACE_ID: process.env.CONTENTFUL_SPACE_ID,
CONTENTFUL_ACCESS_TOKEN: process.env.CONTENTFUL_ACCESS_TOKEN,
},
});
参考docs
您需要在项目中添加一个 next.config.js 文件。在该文件中定义环境变量,这些变量将在您的应用程序中可用。
如果不公开您的 API 凭据,您将无法从客户端发出此类请求。你必须有一个后端。
您可以使用 Next.js /pages/api
向 Contentful 发出请求,然后将其传递给您的前端。
只需创建一个 .env
文件,添加变量并在您的 API 路由中引用它,如下所示:
process.env.CONTENTFUL_SPACE_ID
从 Next.js 9.4 开始,您不需要 next.config.js。
通过将变量添加到 next.config.js
,您已将秘密 暴露给客户端。任何人都可以看到这些秘密。
New Environment Variables Support
Create a Next.js App with Contentful and Deploy It with Vercel
npm i --save dotenv-webpack@2.0.0 // version 3.0.0 has a bug
在根目录中创建 .env.development.local
文件。并在此处添加您的环境变量:
AUTH0_COOKIE_SECRET=eirhg32urrroeroro9344u9832789327432894@@@
NODE_ENV=development
AUTH0_NAMESPACE=https:ilmrerino.auth0.com
在您的应用程序的根目录中创建 next.config.js
。
const Dotenv = require("dotenv-webpack");
module.exports = {
webpack: (config) => {
config.resolve.alias["@"] = path.resolve(__dirname);
config.plugins.push(new Dotenv({ silent: true }));
return config;
},
};
但是这些环境变量将被服务器访问。如果你想使用任何环境变量,你必须再添加一个配置。
module.exports = {
webpack: (config) => {
config.resolve.alias["@"] = path.resolve(__dirname);
config.plugins.push(new Dotenv({ silent: true }));
return config;
},
env: {
AUTH0_NAMESPACE: process.env.AUTH0_NAMESPACE,
},
};
不要 把敏感的东西放在 next.config.js
但是 在我的例子中我有一些不是的环境变量非常敏感,我需要服务器端和客户端,然后你可以这样做:
// .env file:
VARIABLE_X=XYZ
// next.config.js
module.exports = {
env: {
VARIABLE_X: process.env.VARIABLE_X,
},
}
我建议在 nextjs 9.4 及更高版本上更新,使用此示例:
.env.local
NEXT_PUBLIC_SECRET_KEY=i7z7GeS38r10orTRr1i
并且在您的代码的任何部分,您可以使用:
.js
const SECRET_KEY = process.env.NEXT_PUBLIC_SECRET_KEY
note that it must be the same name of the key "NEXT_PUBLIC_ SECRET_KEY" and not only "SECRET_KEY"
当你 运行 它确保在日志中说
$ next dev
Loaded env from E:\awesome-project\client\.env.local
ready - started server on http://localhost:3000
...
要了解有关环境变量的更多信息,请参阅 this link
如果您使用的是最新版本的 nextJs(9 以上)
然后按照以下步骤操作:
- Create a .env.local file in the root of the project.
- Add the prefix NEXT_PUBLIC_ to all of your environment variables.
eg: NEXT_PUBLIC_SOMETHING=12345
- use them in any JS file like with prefix process.env
eg: process.env.NEXT_PUBLIC_SOMETHING
您必须在 next.config.js
中进行简单的更改const nextConfig = {
reactStrictMode: true,
env:{
MYACCESSTOKEN : process.env.MYACCESSTOKEN,
MYSPACEID: process.env.MYSPACEID,
}
}
module.exports = nextConfig
改成这样