Создать экземпляр express в другом файле - PullRequest
0 голосов
/ 05 марта 2020

У меня есть следующий сценарий:

пользователей. js

const express        = require('express');
const bodyParser     = require('body-parser');
const app            = express(); 
const apiRoot        = '/api/v1/users';

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(function (req, res, next) {    
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', false);
    next();
});

app.get(apiRoot, async function(req, res) {
    [... do stuff ...]
});
app.get(apiRoot + '/:id', async function(req, res){
    [... do stuff ...]
});
app.listen(process.env.PORT);

заказов. js

const express        = require('express');
const bodyParser     = require('body-parser');
const app            = express(); 
const apiRoot        = '/api/v1/bookings';

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(function (req, res, next) {    
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', false);
    next();
});

app.get(apiRoot, async function(req, res) {
    [... do stuff ...]
});
app.get(apiRoot + '/:id', async function(req, res){
    [... do stuff ...]
});
app.listen(process.env.PORT);

Работает нормально и без ошибок. Проблема в том, что мне нужно сохранить все мои настройки app в более чем одном файле (у меня есть другие, кроме users.js и bookings.js ...). Есть ли способ, которым я могу сконцентрировать создание app в одном файле и импортировать его в users.js, bookings.js и так далее?

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Более распространенный дизайн и способ создания Express заключается в том, что каждый из ваших файлов должен создавать маршрутизатор и экспортировать маршрутизатор. Затем у вас будет один главный файл, который создает объект app, импортирует каждый из ваших модулей и перехватывает их маршрутизатор. В этом случае вы также можете экспортировать root, на который они хотят быть установлены.

// m1 module

const express        = require('express');
const router         = express.Router();
const apiRoot        = '/api/v1/users';

// set up router-specific middleware
// if this is the same for all routers, then move this to app.js and just
//    do it once there
router.use(express.urlencoded({ extended: false }));
router.use(express.json());
router.use(function (req, res, next) {    
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', false);
    next();
});

// Configure routes for this router
// The router is installed already on apiRoot so we don't need that in the paths here
router.get('/', async function(req, res) {
    [... do stuff ...]
});
router.get('/:id', async function(req, res){
    [... do stuff ...]
});

module.exports = {apiRoot, router};

Тогда у вас будет основное приложение. js:

const express = require('express');
const app = express();

// load and hook in the other routers
const m1 = require('./m1");
app.use(m1.apiRoot, m1.router);

const m2 = require('./m2");
app.use(m2.apiRoot, m2.router);

app.listen(process.env.PORT);

Если вы действительно хотите, чтобы промежуточное ПО body-parser и CORS были общими для всех ваших маршрутизаторов, переместите его в приложение. js, чтобы файлы вашего маршрутизатора были только для обслуживания маршрутов.

1 голос
/ 05 марта 2020

Каждый набор маршрутов может быть просто в файле, который экспортирует функцию, которая принимает app, например,

// bookings.js
module.exports = function(app) {
  app.get(...)
};

, затем в вашем основном

const bookingsRoutes = require('./bookings');
bookingsRoutes(app);
0 голосов
/ 07 марта 2020

Оба ответа не сработали в моей среде, потому что я использую nodejs на сервере IIS. Вот решение, которое я использовал:

приложение. js

const express       = require('express');
const bodyParser    = require('body-parser');
const app           = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(function (req, res, next) {    
   res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
   res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
   res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
   res.setHeader('Access-Control-Allow-Credentials', false);
   next();
});
app.listen(process.env.PORT);

module.exports = function() { return app; }    

пользователей. js

const app           = require('./app')();
const list          = require('./list'); 
const apiRoot       = '/api/v1/users'; 

app.get(apiRoot, async function(req, res) {
    // [... do stuff ...]
});

Спасибо за предоставленные ответы. Они направили меня в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...