【发布时间】:2020-10-04 18:26:16
【问题描述】:
所以我使用 Contentful API 从我的帐户中获取一些内容并将其显示在我的 Next.Js 应用程序中(我使用的是 next 9.4.4)。这里非常基本。现在为了保护我的凭据,我想使用环境变量(我以前从未使用过它,而且我对这一切都很陌生,所以我有点迷失了)。
我正在使用以下内容在我的 index.js 文件中创建 Contentful Client:
const client = require('contentful').createClient({
space: 'MYSPACEID',
accessToken: 'MYACCESSTOKEN',
});
MYSPACEID 和 MYACCESSTOKEN 是硬编码的,所以我想将它们放在一个 .env 文件中以保护它,并且在 Vercel 上部署时不要将其公开。
我创建了一个.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 检索内容并将它们作为道具传递给我的组件:
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 中的工作原理,因为我已经阅读过在 pages/api/ 中创建 api 请求可能会更好,但我不明白如何获取内容,然后像我在这里所做的那样将响应传递到我的页面组件中..
任何帮助将不胜感激!
编辑:
所以我通过将我的环境变量添加到我的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,
},
});
【问题讨论】:
-
我可以使用 process.env.VARIABLE_NAME 在 getServerSideProps() 中获取 .env.local 变量,但在客户端提交表单时无法获取它们
标签: javascript reactjs environment-variables next.js contentful