我正在尝试在正在处理的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与上面的完全相同。