未验证 提交 b8d075ef 编写于 作者: T Tim Neutkens 提交者: GitHub

Update environment support (#11524)

* Remove req.env

* Rename NEXT_APP_ to NEXT_PUBLIC_

* Remove key exposing env config

* Update tests

* Update NEXT_APP_ test to NEXT_PUBLIC_
上级 ce3f7d05
......@@ -716,7 +716,7 @@ export default async function getBaseWebpackConfig(
...(config.experimental.pageEnv
? Object.keys(process.env).reduce(
(prev: { [key: string]: string }, key: string) => {
if (key.startsWith('NEXT_APP_')) {
if (key.startsWith('NEXT_PUBLIC_')) {
prev[key] = process.env[key]!
}
return prev
......
......@@ -181,7 +181,6 @@ const nextServerlessLoader: loader.Loader = function() {
Object.assign({}, parsedUrl.query, params ),
resolver,
${encodedPreviewProps},
process.env,
onError
)
} catch (err) {
......
......@@ -226,12 +226,13 @@ export default async function(
}
}
loadEnvConfig(dir)
// Start the rendering process
const renderOpts = {
dir,
buildId,
nextExport: true,
env: loadEnvConfig(dir),
assetPrefix: nextConfig.assetPrefix.replace(/\/$/, ''),
distDir,
dev: false,
......
......@@ -70,10 +70,10 @@ export function loadEnvConfig(dir: string, dev?: boolean): Env | false {
}
}
// load global env values prefixed with `NEXT_APP_` to process.env
// load global env values prefixed with `NEXT_PUBLIC_` to process.env
for (const key of Object.keys(combinedEnv)) {
if (
key.startsWith('NEXT_APP_') &&
key.startsWith('NEXT_PUBLIC_') &&
typeof process.env[key] === 'undefined'
) {
process.env[key] = combinedEnv[key]
......
......@@ -8,8 +8,6 @@ import { isResSent, NextApiRequest, NextApiResponse } from '../lib/utils'
import { decryptWithSecret, encryptWithSecret } from './crypto-utils'
import { interopDefault } from './load-components'
import { Params } from './router'
import { collectEnv } from './utils'
import { Env } from '../../lib/load-env-config'
export type NextApiRequestCookies = { [key: string]: string }
export type NextApiRequestQuery = { [key: string]: string | string[] }
......@@ -26,7 +24,6 @@ export async function apiResolver(
params: any,
resolverModule: any,
apiContext: __ApiPreviewProps,
env: Env | false,
onError?: ({ err }: { err: any }) => Promise<void>
) {
const apiReq = req as NextApiRequest
......@@ -41,8 +38,6 @@ export async function apiResolver(
const config: PageConfig = resolverModule.config || {}
const bodyParser = config.api?.bodyParser !== false
apiReq.env = env ? collectEnv(req.url!, env, config.env) : {}
// Parsing of cookies
setLazyProp({ req: apiReq }, 'cookies', getCookieParser(req))
// Parsing query string
......
......@@ -61,7 +61,7 @@ import {
setSprCache,
} from './spr-cache'
import { isBlockedPage } from './utils'
import { loadEnvConfig, Env } from '../../lib/load-env-config'
import { loadEnvConfig } from '../../lib/load-env-config'
const getCustomRouteMatcher = pathMatch(true)
......@@ -118,7 +118,6 @@ export default class Server {
documentMiddlewareEnabled: boolean
hasCssMode: boolean
dev?: boolean
env: Env | false
previewProps: __ApiPreviewProps
customServer?: boolean
ampOptimizerConfig?: { [key: string]: any }
......@@ -147,7 +146,7 @@ export default class Server {
this.dir = resolve(dir)
this.quiet = quiet
const phase = this.currentPhase()
const env = loadEnvConfig(this.dir, dev)
loadEnvConfig(this.dir, dev)
this.nextConfig = loadConfig(phase, this.dir, conf)
this.distDir = join(this.dir, this.nextConfig.distDir)
......@@ -175,7 +174,6 @@ export default class Server {
staticMarkup,
buildId: this.buildId,
generateEtags,
env: this.nextConfig.experimental.pageEnv && env,
previewProps: this.getPreviewProps(),
customServer: customServer === true ? true : undefined,
ampOptimizerConfig: this.nextConfig.experimental.amp?.optimizer,
......@@ -693,7 +691,6 @@ export default class Server {
query,
pageModule,
this.renderOpts.previewProps,
this.renderOpts.env,
this.onErrorMiddleware
)
return true
......
......@@ -38,8 +38,6 @@ import { tryGetPreviewData, __ApiPreviewProps } from './api-utils'
import { getPageFiles } from './get-page-files'
import { LoadComponentsReturnType, ManifestItem } from './load-components'
import optimizeAmp from './optimize-amp'
import { collectEnv } from './utils'
import { Env } from '../../lib/load-env-config'
import { UnwrapPromise } from '../../lib/coalesced-function'
import { GetStaticProps, GetServerSideProps } from '../../types'
......@@ -156,7 +154,6 @@ export type RenderOptsPartial = {
isDataReq?: boolean
params?: ParsedUrlQuery
previewProps: __ApiPreviewProps
env: Env | false
}
export type RenderOpts = LoadComponentsReturnType & RenderOptsPartial
......@@ -291,7 +288,6 @@ export async function renderToHTML(
staticMarkup = false,
ampPath = '',
App,
env = {},
Document,
pageConfig = {},
DocumentMiddleware,
......@@ -307,8 +303,6 @@ export async function renderToHTML(
previewProps,
} = renderOpts
const curEnv = env ? collectEnv(pathname, env, pageConfig.env) : {}
const callMiddleware = async (method: string, args: any[], props = false) => {
let results: any = props ? {} : []
......@@ -509,7 +503,6 @@ export async function renderToHTML(
try {
data = await getStaticProps!({
env: curEnv,
...(pageIsDynamic ? { params: query as ParsedUrlQuery } : undefined),
...(previewData !== false
? { preview: true, previewData: previewData }
......@@ -592,7 +585,6 @@ export async function renderToHTML(
req,
res,
query,
env: curEnv,
...(pageIsDynamic ? { params: params as ParsedUrlQuery } : undefined),
...(previewData !== false
? { preview: true, previewData: previewData }
......
import { BLOCKED_PAGES } from '../lib/constants'
import { Env } from '../../lib/load-env-config'
export function isBlockedPage(pathname: string): boolean {
return BLOCKED_PAGES.indexOf(pathname) !== -1
......@@ -15,28 +14,3 @@ export function cleanAmpPath(pathname: string): string {
pathname = pathname.replace(/\?$/, '')
return pathname
}
export function collectEnv(page: string, env: Env, pageEnv?: string[]): Env {
const missingEnvKeys = new Set()
const collected = pageEnv
? pageEnv.reduce((prev: Env, key): Env => {
if (typeof env[key] !== 'undefined') {
prev[key] = env[key]!
} else {
missingEnvKeys.add(key)
}
return prev
}, {})
: {}
if (missingEnvKeys.size > 0) {
console.warn(
`Missing env value${missingEnvKeys.size === 1 ? '' : 's'}: ${[
...missingEnvKeys,
].join(', ')} for ${page}.\n` +
`Make sure to supply this value in either your .env file or in your environment.\n` +
`See here for more info: https://err.sh/next.js/missing-env-value`
)
}
return collected
}
......@@ -5,8 +5,6 @@
import React from 'react'
import { ParsedUrlQuery } from 'querystring'
import { IncomingMessage, ServerResponse } from 'http'
// @ts-ignore This path is generated at build time and conflicts otherwise
import { Env } from '../dist/lib/load-env-config'
import {
NextPageContext,
......@@ -73,7 +71,6 @@ export type GetStaticProps<
params?: ParsedUrlQuery
preview?: boolean
previewData?: any
env: Env
}) => Promise<{
props: P
revalidate?: number | boolean
......@@ -91,7 +88,6 @@ export type GetServerSideProps<
res: ServerResponse
params?: ParsedUrlQuery
query: ParsedUrlQuery
env: Env
preview?: boolean
previewData?: any
}) => Promise<{ props: P }>
......
export const config = {
env: ['NOTION_KEY', 'SENTRY_DSN', 'DATABASE_KEY', 'DATABASE_USER'],
}
export default (req, res) => res.json(req.env)
export const config = {
env: ['NOTION_KEY', 'SENTRY_DSN', 'DATABASE_KEY', 'DATABASE_USER'],
}
export async function getStaticProps({ env }) {
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
revalidate: 1,
}
}
export default ({ env }) => <p>{JSON.stringify(env)}</p>
export const config = {
env: ['NOTION_KEY', 'SENTRY_DSN', 'DATABASE_KEY', 'DATABASE_USER'],
}
export async function getServerSideProps({ env }) {
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
}
}
export default ({ env }) => <p>{JSON.stringify(env)}</p>
/* eslint-env jest */
/* global jasmine */
import fs from 'fs-extra'
import { join } from 'path'
import {
nextBuild,
findPort,
launchApp,
killApp,
nextStart,
renderViaHTTP,
} from 'next-test-utils'
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 2
const appDir = join(__dirname, '../app')
const envFile = join(appDir, '.env')
const nextConfig = join(appDir, 'next.config.js')
const nextConfigContent = `
experimental: {
pageEnv: true
}
`
let app
let appPort
let output = ''
const envValues = ['NOTION_KEY', 'SENTRY_DSN', 'DATABASE_KEY', 'DATABASE_USER']
const writeEnv = () =>
fs.writeFile(envFile, envValues.map(val => `${val}=value`).join('\n'))
const rmEnv = () => fs.remove(envFile)
const runTests = (isDev = false) => {
const startApp = async () => {
output = ''
appPort = await findPort()
let method = isDev ? launchApp : nextStart
app = await method(appDir, appPort, {
onStdout(msg) {
output += msg
},
onStderr(msg) {
output += msg
},
})
}
if (isDev) {
it('should warn for missing values on SSG page', async () => {
await startApp()
await renderViaHTTP(appPort, '/')
await killApp(app)
expect(output).toContain(
`Missing env values: ${envValues.join(', ')} for /`
)
})
it('should not warn for missing values on SSG page', async () => {
await writeEnv()
await startApp()
await renderViaHTTP(appPort, '/')
await killApp(app)
await rmEnv()
expect(output).not.toContain(
`Missing env values: ${envValues.join(', ')} for /`
)
})
}
it('should warn for missing values on server props page', async () => {
await startApp()
await renderViaHTTP(appPort, '/ssp')
await killApp(app)
expect(output).toContain(
`Missing env values: ${envValues.join(', ')} for /ssp`
)
})
it('should not warn for missing values on server props page', async () => {
await writeEnv()
await startApp()
await renderViaHTTP(appPort, '/ssp')
await killApp(app)
await rmEnv()
expect(output).not.toContain(
`Missing env values: ${envValues.join(', ')} for /ssp`
)
})
it('should warn for missing values on API route', async () => {
await startApp()
await renderViaHTTP(appPort, '/api/hello')
await killApp(app)
expect(output).toContain(
`Missing env values: ${envValues.join(', ')} for /api/hello`
)
})
it('should not warn for missing values on API route', async () => {
await writeEnv()
await startApp()
await renderViaHTTP(appPort, '/api/hello')
await killApp(app)
await rmEnv()
expect(output).not.toContain(
`Missing env values: ${envValues.join(', ')} for /api/hello`
)
})
}
describe('Env Config', () => {
afterEach(async () => {
await fs.remove(envFile)
try {
await killApp(app)
} catch (_) {}
})
afterAll(() => fs.remove(nextConfig))
describe('dev mode', () => {
beforeAll(() =>
fs.writeFile(nextConfig, `module.exports = { ${nextConfigContent} }`)
)
runTests(true)
})
describe('server mode', () => {
beforeAll(async () => {
beforeAll(() =>
fs.writeFile(nextConfig, `module.exports = { ${nextConfigContent} }`)
)
await nextBuild(appDir)
})
runTests()
})
describe('serverless mode', () => {
beforeAll(async () => {
await fs.writeFile(
nextConfig,
`module.exports = { target: 'experimental-serverless-trace', ${nextConfigContent} }`
)
await nextBuild(appDir)
})
runTests()
})
})
......@@ -7,4 +7,4 @@ ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST=env
ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST=env
ENV_FILE_TEST_OVERRIDE_TEST=env
ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST=env
NEXT_APP_TEST_DEST=another
\ No newline at end of file
NEXT_PUBLIC_TEST_DEST=another
\ No newline at end of file
export const config = {
env: [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
],
}
const variables = [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
]
const items = {}
variables.forEach(variable => {
items[variable] = process.env[variable]
})
export default async (req, res) => {
// Only for testing, don't do this...
res.json(req.env)
res.json(items)
}
export default () => <p>{process.env.NEXT_APP_TEST_DEST}</p>
export default () => <p>{process.env.NEXT_PUBLIC_TEST_DEST}</p>
export const config = {
env: [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
],
}
const variables = [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
]
export async function getStaticProps() {
const items = {}
variables.forEach(variable => {
if (process.env[variable]) {
items[variable] = process.env[variable]
}
})
export async function getStaticProps({ env }) {
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
props: { env: items },
revalidate: 1,
}
}
......
export const config = {
env: [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
],
}
const variables = [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
]
export async function getStaticProps() {
const items = {}
variables.forEach(variable => {
if (process.env[variable]) {
items[variable] = process.env[variable]
}
})
export async function getStaticProps({ env }) {
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
props: { env: items },
revalidate: 1,
}
}
......
export const config = {
env: [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
],
}
const variables = [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
]
export async function getServerSideProps() {
const items = {}
variables.forEach(variable => {
if (process.env[variable]) {
items[variable] = process.env[variable]
}
})
export async function getServerSideProps({ env }) {
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
props: { env: items },
}
}
......
export const config = {
env: [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
],
}
const variables = [
'PROCESS_ENV_KEY',
'ENV_FILE_KEY',
'LOCAL_ENV_FILE_KEY',
'ENV_FILE_LOCAL_OVERRIDE_TEST',
'PRODUCTION_ENV_FILE_KEY',
'LOCAL_PRODUCTION_ENV_FILE_KEY',
'DEVELOPMENT_ENV_FILE_KEY',
'LOCAL_DEVELOPMENT_ENV_FILE_KEY',
'ENV_FILE_DEVELOPMENT_OVERRIDE_TEST',
'ENV_FILE_DEVELOPMENT_LOCAL_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_OVERRIDEOVERRIDE_TEST',
'ENV_FILE_PRODUCTION_LOCAL_OVERRIDEOVERRIDE_TEST',
'TEST_ENV_FILE_KEY',
'LOCAL_TEST_ENV_FILE_KEY',
'ENV_FILE_TEST_OVERRIDE_TEST',
'ENV_FILE_TEST_LOCAL_OVERRIDEOVERRIDE_TEST',
]
export async function getServerSideProps() {
const items = {}
export async function getServerSideProps({ env }) {
variables.forEach(variable => {
if (process.env[variable]) {
items[variable] = process.env[variable]
}
})
return {
// Do not pass any sensitive values here as they will
// be made PUBLICLY available in `pageProps`
props: { env },
props: { env: items },
}
}
......
......@@ -30,7 +30,7 @@ const nextConfigContent = `
{
source: '/hello',
permanent: false,
destination: \`/\${process.env.NEXT_APP_TEST_DEST}\`,
destination: \`/\${process.env.NEXT_PUBLIC_TEST_DEST}\`,
}
]
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册