2016-07-27 25 views
0

Ich baue eine App in Express, aber ich möchte es an S3 rufen, um einige Schlüssel abzurufen, bevor der Server tatsächlich gestartet wird. Ist das in Express möglich? Wenn ich google bootstrap Express bekomme ich Treffer für die Einrichtung Express mit Twitter Bootstrap.Gibt es eine Möglichkeit, eine Express-App zu booten?

Ich habe Sails.js zuvor verwendet und Sie könnten Bootstrap-Konfigurationen in einer bootstrap.js-Datei angeben, also denke ich, dass ich nach etwas ähnlichem suche. Gibt es sonst Alternativen?

Ich habe eine index.js-Datei und eine separate bin/www-Datei, die die index.js-Datei aufruft. Ich möchte das Bootstrapping in index.js gemacht, so dass es als Teil der Tests enthalten ist. Im Moment Ich initialisieren "die Bootstrap aber wie es asynchron ist der Server ist bereits aktiv, bevor der Bootstrap hat komplett (oder errored out), dh

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; 

Antwort

0

Posting meine Lösung für alle, die über das gleiche kommt und hat eine Kopf frei. Ich behielt die bin/www und index.js Dateien getrennt, aber hatte das Express-Objekt von index.js über eine Methode zurückgegeben. Lösung unten dank der freundlichen Leute von Github.

Index.js Datei:

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; 
    }) 
} 

bin/www-Datei:

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); 
    }); 

Integrationstests:

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); 
    }); 
    }); 
});