Node.js 使用前未加载带有ExpressJS服务器环境变量的NextJS
我有一个带有ExpressJS服务器的NextJS应用程序,用于处理应用程序的某些部分,以进行身份验证。在我尝试使用Sequelize ORM为数据库配置使用env变量之前,应用程序运行没有问题。起初我认为这可能是由于NextJS和ExpressJS同时运行造成的细微差别,但在代码中的不同点进行控制台日志记录之后,我的Sequelize DB config文件似乎正在运行,并在NextJS/ExpressJS从文件中加载环境变量之前设置了环境变量 有人能提供背景说明为什么会这样吗Node.js 使用前未加载带有ExpressJS服务器环境变量的NextJS,node.js,express,environment-variables,next.js,Node.js,Express,Environment Variables,Next.js,我有一个带有ExpressJS服务器的NextJS应用程序,用于处理应用程序的某些部分,以进行身份验证。在我尝试使用Sequelize ORM为数据库配置使用env变量之前,应用程序运行没有问题。起初我认为这可能是由于NextJS和ExpressJS同时运行造成的细微差别,但在代码中的不同点进行控制台日志记录之后,我的Sequelize DB config文件似乎正在运行,并在NextJS/ExpressJS从文件中加载环境变量之前设置了环境变量 有人能提供背景说明为什么会这样吗 config/
config/sequelize.js
MyDB配置文件:
console.log("Loading config file")
console.log(process.env.DB_DATABASE) // Returns undefined
module.exports = {
"development": {
"username": "username",
"password": "password",
"database": process.env.DB_DATABASE, // undefined
"dialect": "postgres"
},
}
console.log('server.js - file read')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns undefined
const express = require('express')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
console.log('app.prepare() triggered. Express server configuration started below')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
// Setting proxy for session handlng that is required for non-dev servers
if (!dev){
server.set('trust poxy', 1)
}
// ExpressJS Routes
server.use(routes);
// Mount the router on the app
// Any routes that aren't handled by ExpressJS are handled by NextJS
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log('> Ready on http://localhost:3000')
console.log('Expressjs server listening')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
npm run dev
> next-js-boilerplate@0.1.0 dev /Users/user/dev/nextjs/auth-boilerplate
> nodemon server.js
[nodemon] 2.0.7
[nodemon] reading config ./nodemon.json
[nodemon] to restart at any time, enter `rs`
[nodemon] or send SIGHUP to 81315 to restart
[nodemon] ignoring: ./node_modules/**/* ./.next/**/*
[nodemon] watching path(s): controllers/**/* models/**/* config/**/* libs/**/* ssr-server.js
[nodemon] watching extensions: js,json
[nodemon] starting `node server.js`
[nodemon] forking
[nodemon] child pid: 81317
[nodemon] watching 9 files
server.js - file read
process.env.DB_DATABASE: undefined
Loading config
undefined
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Loaded env from /Users/connorphillips/dev/nextjs/auth-boilerplate/.env
info - Using external babel configuration from /Users/connorphillips/dev/nextjs/auth-boilerplate/.babelrc
event - compiled successfully
app.prepare() triggered. Express server configuration started below
process.env.DB_DATABASE: email_local
> Ready on http://localhost:3000
Expressjs server listening
process.env.DB_DATABASE: email_local
server.js
mynextjs&ExpressJS服务器:
console.log("Loading config file")
console.log(process.env.DB_DATABASE) // Returns undefined
module.exports = {
"development": {
"username": "username",
"password": "password",
"database": process.env.DB_DATABASE, // undefined
"dialect": "postgres"
},
}
console.log('server.js - file read')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns undefined
const express = require('express')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
console.log('app.prepare() triggered. Express server configuration started below')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
// Setting proxy for session handlng that is required for non-dev servers
if (!dev){
server.set('trust poxy', 1)
}
// ExpressJS Routes
server.use(routes);
// Mount the router on the app
// Any routes that aren't handled by ExpressJS are handled by NextJS
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log('> Ready on http://localhost:3000')
console.log('Expressjs server listening')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
npm run dev
> next-js-boilerplate@0.1.0 dev /Users/user/dev/nextjs/auth-boilerplate
> nodemon server.js
[nodemon] 2.0.7
[nodemon] reading config ./nodemon.json
[nodemon] to restart at any time, enter `rs`
[nodemon] or send SIGHUP to 81315 to restart
[nodemon] ignoring: ./node_modules/**/* ./.next/**/*
[nodemon] watching path(s): controllers/**/* models/**/* config/**/* libs/**/* ssr-server.js
[nodemon] watching extensions: js,json
[nodemon] starting `node server.js`
[nodemon] forking
[nodemon] child pid: 81317
[nodemon] watching 9 files
server.js - file read
process.env.DB_DATABASE: undefined
Loading config
undefined
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Loaded env from /Users/connorphillips/dev/nextjs/auth-boilerplate/.env
info - Using external babel configuration from /Users/connorphillips/dev/nextjs/auth-boilerplate/.babelrc
event - compiled successfully
app.prepare() triggered. Express server configuration started below
process.env.DB_DATABASE: email_local
> Ready on http://localhost:3000
Expressjs server listening
process.env.DB_DATABASE: email_local
以下是按执行顺序排列的终端输出:
console.log("Loading config file")
console.log(process.env.DB_DATABASE) // Returns undefined
module.exports = {
"development": {
"username": "username",
"password": "password",
"database": process.env.DB_DATABASE, // undefined
"dialect": "postgres"
},
}
console.log('server.js - file read')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns undefined
const express = require('express')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
console.log('app.prepare() triggered. Express server configuration started below')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
// Setting proxy for session handlng that is required for non-dev servers
if (!dev){
server.set('trust poxy', 1)
}
// ExpressJS Routes
server.use(routes);
// Mount the router on the app
// Any routes that aren't handled by ExpressJS are handled by NextJS
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log('> Ready on http://localhost:3000')
console.log('Expressjs server listening')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
npm run dev
> next-js-boilerplate@0.1.0 dev /Users/user/dev/nextjs/auth-boilerplate
> nodemon server.js
[nodemon] 2.0.7
[nodemon] reading config ./nodemon.json
[nodemon] to restart at any time, enter `rs`
[nodemon] or send SIGHUP to 81315 to restart
[nodemon] ignoring: ./node_modules/**/* ./.next/**/*
[nodemon] watching path(s): controllers/**/* models/**/* config/**/* libs/**/* ssr-server.js
[nodemon] watching extensions: js,json
[nodemon] starting `node server.js`
[nodemon] forking
[nodemon] child pid: 81317
[nodemon] watching 9 files
server.js - file read
process.env.DB_DATABASE: undefined
Loading config
undefined
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Loaded env from /Users/connorphillips/dev/nextjs/auth-boilerplate/.env
info - Using external babel configuration from /Users/connorphillips/dev/nextjs/auth-boilerplate/.babelrc
event - compiled successfully
app.prepare() triggered. Express server configuration started below
process.env.DB_DATABASE: email_local
> Ready on http://localhost:3000
Expressjs server listening
process.env.DB_DATABASE: email_local
执行命令摘要:
console.log("Loading config file")
console.log(process.env.DB_DATABASE) // Returns undefined
module.exports = {
"development": {
"username": "username",
"password": "password",
"database": process.env.DB_DATABASE, // undefined
"dialect": "postgres"
},
}
console.log('server.js - file read')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns undefined
const express = require('express')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
console.log('app.prepare() triggered. Express server configuration started below')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
// Setting proxy for session handlng that is required for non-dev servers
if (!dev){
server.set('trust poxy', 1)
}
// ExpressJS Routes
server.use(routes);
// Mount the router on the app
// Any routes that aren't handled by ExpressJS are handled by NextJS
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log('> Ready on http://localhost:3000')
console.log('Expressjs server listening')
console.log('process.env.DB_DATABASE: ' + process.env.DB_DATABASE) // Returns "db_template". CORRECT!
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
npm run dev
> next-js-boilerplate@0.1.0 dev /Users/user/dev/nextjs/auth-boilerplate
> nodemon server.js
[nodemon] 2.0.7
[nodemon] reading config ./nodemon.json
[nodemon] to restart at any time, enter `rs`
[nodemon] or send SIGHUP to 81315 to restart
[nodemon] ignoring: ./node_modules/**/* ./.next/**/*
[nodemon] watching path(s): controllers/**/* models/**/* config/**/* libs/**/* ssr-server.js
[nodemon] watching extensions: js,json
[nodemon] starting `node server.js`
[nodemon] forking
[nodemon] child pid: 81317
[nodemon] watching 9 files
server.js - file read
process.env.DB_DATABASE: undefined
Loading config
undefined
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Loaded env from /Users/connorphillips/dev/nextjs/auth-boilerplate/.env
info - Using external babel configuration from /Users/connorphillips/dev/nextjs/auth-boilerplate/.babelrc
event - compiled successfully
app.prepare() triggered. Express server configuration started below
process.env.DB_DATABASE: email_local
> Ready on http://localhost:3000
Expressjs server listening
process.env.DB_DATABASE: email_local
- 已读取server.js文件
- 已读取config/sequelize.js文件
- 从.env.development加载的环境
- 已触发server.js app.prepare()
- 已触发server.js server.listen()
我遇到了同样的问题 在执行app.prepare()之前,将初始化代码顶部导入的模块。
我认为您的
config/sequelize.js
是从“routes”
模块导入的
我的解决方法是将“路由”
导入app.prepare().then()
app.prepare()
.然后(()=>{
...
//ExpressJS路线
//使用require,因为javascirpt导入已挂起。
使用(require('./您的路由路径');//如果使用module.exports
使用(require('./您的路由路径').default);//如果使用导出默认值
...
})
正在使用的config/sequelize.js
在哪里?Hey@juliomalves它正在我的sequelize ORM索引模型文件中使用,并传递给sequelize包的新实例new sequelize(config.database,…)代码>。这就是问题所在,因为它启动Sequelize并抛出一个错误,表示没有传递值