2016-07-27 3 views
0

Я создаю приложение в Express, но мне бы хотелось, чтобы он обратился к S3, чтобы получить некоторые ключи до того, как сервер действительно запустится. Возможно ли это в Express? Если я google bootstrap Express, я получаю хиты для настройки Express с twitter Bootstrap.Есть ли способ загружать приложение Express?

Я использовал Sails.js раньше, и вы могли бы указать настройки бутстрапа в файле bootstrap.js, поэтому я думаю, что я ищу что-то подобное. В противном случае есть альтернативы?

У меня есть файл index.js и отдельный файл bin/www, который вызывает файл index.js. Я хотел бы, чтобы начальная загрузка выполнялась в index.js, чтобы она включалась как часть тестов. Сейчас я инициализировать 'начальной загрузки, но так как это асинхронный сервер уже запущен и работает до начальной загрузки имеет полную (или ошибочный из), т.е.

import express from 'express'; 
import {initializeFromS3} from './services/initializerService'; 
import healthCheckRouter from './routes/healthCheckRouter'; 
import bodyParser from 'body-parser'; 

initializeFromS3(); // Calls out to S3 and does some bootstrapping of configurations 
const app = express(); 

app.use(bodyParser.json());  // to support JSON-encoded bodies 
app.use(bodyParser.urlencoded({  // to support URL-encoded bodies 
    extended: true 
})); 

// ---------------------------- Routes ---------------------------- 
app.use('/', express.static('dist/client/')); 
app.use('/health-check', healthCheckRouter); 

export default app; 

ответ

0

Проводка мое решение для тех, кто попадается то же самое и имеет ум пустой. Я сохранил файлы bin/www и index.js отдельно, но с помощью метода экспресс-объект возвращался из index.js. Решение ниже благодаря дружелюбным людям Github.

index.js файл:

import express from 'express'; 
import {initialize} from './services/appService'; 
import healthCheckRouter from './routes/healthCheckRouter'; 
import loginRouter from './routes/loginRouter'; 


export function getExpress() { 
    return initialize() 
    .then(() => { 
     const app = express(); 

     // ---------------------------- Routes ---------------------------- 
     app.use('/', express.static('dist/client/')); 
     app.use('/login', loginRouter); 
     app.use('/health-check', healthCheckRouter); 
     return app; 
    }) 
} 

бен/WWW файла:

import winston from 'winston'; 
import bodyParser from 'body-parser'; 

import {getExpress} from '../index'; 

getExpress() 
    .then(app => { 
    app.use(bodyParser.json());  // to support JSON-encoded bodies 
    app.use(bodyParser.urlencoded({  // to support URL-encoded bodies 
     extended: true 
    })); 

    const port = 3002; 
    app.listen(port,() => { 
     winston.info(`Server listening on port ${port}!`); 
    }); 
    }) 
    .catch(err => { 
    winston.error('Error starting server', err); 
    }); 

Интеграционные тесты:

import request from 'supertest'; 
import {getExpress} from '../../index' 

describe('/login integration test',() => { 
    let app = null; 

    beforeEach(done => { 
    getExpress() 
     .then(res => { 
     app = res; 
     done(); 
     }); 
    }); 

    describe('GET /login',() => { 
    it('should return 400 error if \'app\' is not provided as a query string', done => { 
     request(app) 
     .get('/login') 
     .expect(400, done); 
    }); 
    }); 
});