Express.js app入口点

时间:2017-02-16 21:18:03

标签: javascript node.js express

似乎某些路由中间件在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);

1 个答案:

答案 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());