2017-02-16 31 views
-3

index.js之前出現了一些路由中間件,它正在崩潰我的應用程序,因爲執行順序使我無法按時加載我的dotenv文件。Express.js應用程序入口點

我想在所有內容之前加載我的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

它是'index.js' @KevinB – softcode

+0

沒錯。所以,你從中間件/ auth導入auth,所以middelware/auth運行,以便你可以從它導入,然後你需要dotenv。說得通。你實際上應該看到你所看到的。 –

回答

0

從你的問題的代碼片段中不清楚問題的原因,因爲我認爲你省略了導入auth.route.js模塊的地方。

下面的回答假設你實際上是在index.js文件導入auth.route.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()); 
+0

是的工作。然而,修改我的驗證功能本身而不是所有受保護的路線可能更容易 – softcode

相關問題