NodeJS-依赖注入混淆

时间:2018-07-13 21:03:14

标签: javascript node.js express

我正在尝试在正在处理的Express / Node项目中创建API端点。问题是返回用于API路由的路由器。另外,我不完全了解发生了什么。

该应用的所有内容都在server.js中设置:

require('dotenv').config();
const env = process.env;

const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const routes = require('./routes/routes');
const ActiveDirectory = require('./ActiveDirectory');
const HeyListen = require('./HeyListen')(io, ActiveDirectory);
const HeyListenHandler = require('./HeyListenHandler')(HeyListen);

const sesh = {
    secret: env.JWT_SECRET,
    resave: false,
    saveUninitialized: false,
};

process.title = 'Hey Listen Server';

// Server Start
server.listen(env.APP_PORT, () => console.log('Listening on Port: ' + env.APP_PORT));

// Setup
app.use(express.static('lib/creator/public'));
app.use(express.json());
if ( env.ENVIRONMENT === 'production' ) {
    app.set('trust proxy', 1);
    sesh.cookie.secure = true;
}
app.use(session(sesh));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'pug');
app.set('views','./lib/creator/views');

// Routing
app.use('/api', routes.api);
app.use('/', routes.creator);

routes.js

const api = require('./api');
const creator = require('./creator');

module.exports = {  api: api, creator: creator };

api.js

const router = require('express').Router();
const APIController = require('../Controllers/APIController');

module.exports = (HeyListen) => {
    const controller = new APIController(HeyListen);
    router.use(/\/(create|update)/, controller.middleware);
    router.post('/token', controller.token);
    router.post('/create', controller.create.bind(controller));
    router.post('/update', controller.update.bind(controller));
    return router;
}

主要问题是module.exports = (HeyListen) => { .. }HeyListen不是对server.js顶部的HeyListen变量的引用,并且app.use('/api', routes.api)并不是从Express获取Router的实例,而是一个通用函数。这会导致任何请求/api/x超时。

console.log(routes.creator)返回{ [Function: router] .. },而routes.api返回[Function]

我想要的是将HeyListen从server.js传递到api.js,以便可以在APIController中使用它。 HeyListen基本上可以处理所有请求,并具有我想在APIController中使用的帮助程序功能-我不想在控制器本身中重新创建它。

更新

我设法通过了应有的一切,现在正在工作。但是,我不确定这是否是“正确的方法”。

server.js

// Everything else is the same
app.use('/api', routes.api(HeyListen));

routes.js

// Everything else is the same
module.exports = {  api(HeyListen) { return api(HeyListen) }, creator: creator };

并且api.js与上面的完全相同。

0 个答案:

没有答案