似乎某些路由中间件在index.js
之前运行,这会导致我的应用程序崩溃,因为执行顺序阻止我按时加载我的dotenv文件。
我想在所有内容之前加载我的dotenv文件,以确保所有需要它的模块都可以访问它。
但是,在调试此问题时,我注意到应用入口点顶部的console.log
仍未首先记录。
文件夹结构:
src
------index.js
middleware
------auth.js
routes
------auth.route.js
------index.js
.env
首先记录的代码middleware/auth.js
:
import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt'
module.exports = function() {
console.log('this prints first with undefined', process.env.JWT_SECRET) <-------
在auth.route.js
import auth from '../middleware/auth'
const userRouter = express.Router()
userRouter.get('/dashboard', auth().authenticate(), function(req, res) {
res.send('Authenticated, user id is: ' + req.user.id)
})
index.js
档案:
console.log("this prints second"); <---------
(...)
import routes from './routes'
import express from 'express'
import auth from './middleware/auth'
require('dotenv').config({ silent: process.env.NODE_ENV === 'production' })
const app = express();
(...)
app.use('/api', routes);
答案 0 :(得分:0)
您的问题中的代码片段不清楚问题所在,因为我认为您已经省略了导入auth.route.js
模块的位置。
下面的答案假定您实际导入auth.route.js
文件中的index.js
,可能在导入middleware/auth
之前(实际上在您发布的代码片段中没有使用) 。因此,基于这个假设,这里可能发生了什么:
要记住的是模块中的代码在导入时执行。这一开始并不会影响middleware/auth
,因为它所做的就是声明一个函数。但它 影响auth.route.js
- 看一下该模块的作用:
它从auth
模块导入middleware/auth
函数,该模块调用userRouter.get()
函数。该函数的一个参数是调用auth()
函数。
如果您在代码中导入auth.route.js
(并且我怀疑您是),那么 其中auth
函数被调用过早。
现在,如何解决这个问题?它实际上非常简单:auth.route.js
文件应该导出一个函数,当你准备就绪时调用它来初始化路径,如下所示:
<强> auth.route.js 强>
import auth from '../middleware/auth'
const userRouter = express.Router()
export default () => {
userRouter.get('/dashboard', auth().authenticate(), function(req, res) {
res.send('Authenticated, user id is: ' + req.user.id)
})
return userRouter;
}
当你准备好初始化路线时(即当其他所有路线都设置完毕时)。
import getRouter from './modules/auth.route.js';
app.use('/api', getRouter());