Merge pull request #293 from strongloop/feature/express-4.x

Upgrade to Express 4.x
This commit is contained in:
Raymond Feng 2014-06-02 08:26:35 -07:00
commit 663e2d1903
6 changed files with 78 additions and 110 deletions

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

56
lib/express-middleware.js Normal file
View File

@ -0,0 +1,56 @@
var express = require('express');
var path = require('path');
var middlewares = express.middlewares = {};
function safeRequire(m) {
try {
return require(m);
} catch (err) {
return undefined;
}
}
function createMiddlewareNotInstalled(memberName, moduleName) {
return function () {
throw new Error('The middleware loopback.' + memberName + ' is not installed.\n' +
'Please run `npm install ' + moduleName + '` to fix the problem.');
};
}
var middlewareModules = {
"compress": "compression",
"timeout": "connect-timeout",
"cookieParser": "cookie-parser",
"cookieSession": "cookie-session",
"csrf": "csurf",
"errorHandler": "errorhandler",
"session": "express-session",
"methodOverride": "method-override",
"logger": "morgan",
"responseTime": "response-time",
"favicon": "serve-favicon",
"directory": "serve-index",
// "static": "serve-static",
"vhost": "vhost"
};
middlewares.bodyParser = safeRequire('body-parser');
middlewares.json = middlewares.bodyParser && middlewares.bodyParser.json;
middlewares.urlencoded = middlewares.bodyParser && middlewares.bodyParser.urlencoded;
for (var m in middlewareModules) {
var moduleName = middlewareModules[m];
middlewares[m] = safeRequire(moduleName) || createMiddlewareNotInstalled(m, moduleName);
}
// serve-favicon requires a path
var favicon = middlewares.favicon;
middlewares.favicon = function (icon, options) {
icon = icon || path.join(__dirname, '../favicon.ico');
return favicon(icon, options);
};
module.exports = express;

View File

@ -2,15 +2,12 @@
* Module dependencies.
*/
var express = require('express')
var express = require('./express-middleware')
, fs = require('fs')
, ejs = require('ejs')
, EventEmitter = require('events').EventEmitter
, path = require('path')
, proto = require('./application')
, DataSource = require('loopback-datasource-juggler').DataSource
, ModelBuilder = require('loopback-datasource-juggler').ModelBuilder
, i8n = require('inflection')
, merge = require('util')._extend
, assert = require('assert');
@ -103,6 +100,13 @@ for (var key in express) {
, Object.getOwnPropertyDescriptor(express, key));
}
for (var key in express.middlewares) {
Object.defineProperty(
loopback
, key
, Object.getOwnPropertyDescriptor(express.middlewares, key));
}
/*!
* Expose additional loopback middleware
* for example `loopback.configure` etc.

View File

@ -32,8 +32,9 @@
},
"dependencies": {
"debug": "~0.8.1",
"express": "~3.5.0",
"strong-remoting": "~1.4.0",
"express": "4.x",
"body-parser": "~1.2.2",
"strong-remoting": "2.0.0-beta2",
"inflection": "~1.3.5",
"passport": "~0.2.0",
"passport-local": "~1.0.0",
@ -44,34 +45,37 @@
"underscore": "~1.6.0",
"uid2": "0.0.3",
"async": "~0.9.0",
"canonical-json": "0.0.3"
"canonical-json": "0.0.4"
},
"peerDependencies": {
"loopback-datasource-juggler": "2.0.0-beta1"
},
"devDependencies": {
"cookie-parser": "~1.1.0",
"errorhandler": "~1.0.1",
"serve-favicon": "~2.0.0",
"loopback-datasource-juggler": "2.0.0-beta1",
"mocha": "~1.18.0",
"strong-task-emitter": "0.0.x",
"supertest": "~0.12.1",
"supertest": "~0.13.0",
"chai": "~1.9.1",
"loopback-testing": "~0.1.2",
"browserify": "~4.1.5",
"loopback-testing": "~0.1.3",
"browserify": "~4.1.6",
"grunt": "~0.4.5",
"grunt-browserify": "~2.1.0",
"grunt-contrib-uglify": "~0.4.0",
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-watch": "~0.6.1",
"karma-script-launcher": "~0.1.0",
"karma-chrome-launcher": "~0.1.3",
"karma-chrome-launcher": "~0.1.4",
"karma-firefox-launcher": "~0.1.3",
"karma-html2js-preprocessor": "~0.1.0",
"karma-phantomjs-launcher": "~0.1.4",
"karma": "~0.12.16",
"karma-browserify": "~0.2.0",
"karma-browserify": "~0.2.1",
"karma-mocha": "~0.1.3",
"grunt-karma": "~0.8.3",
"loopback-explorer": "~1.1.0"
"loopback-explorer": "~1.1.1"
},
"repository": {
"type": "git",

View File

@ -327,102 +327,6 @@ describe('app', function() {
});
});
describe('installMiddleware()', function() {
var app;
beforeEach(function() { app = loopback(); });
it('installs loopback.token', function(done) {
app.models.accessToken = loopback.AccessToken;
app.installMiddleware();
app.get('/', function(req, res) {
res.send({ accessTokenId: req.accessToken && req.accessToken.id });
});
app.models.accessToken.create({}, function(err, token) {
if (err) done(err);
request(app).get('/')
.set('Authorization', token.id)
.expect(200, { accessTokenId: token.id })
.end(done);
});
});
it('emits "middleware:preprocessors" before handlers are installed',
function(done) {
app.on('middleware:preprocessors', function() {
this.use(function(req, res, next) {
req.preprocessed = true;
next();
});
});
app.installMiddleware();
app.get('/', function(req, res) {
res.send({ preprocessed: req.preprocessed });
});
request(app).get('/')
.expect(200, { preprocessed: true})
.end(done);
}
);
it('emits "middleware:handlers before installing express router',
function(done) {
app.on('middleware:handlers', function() {
this.use(function(req, res, next) {
res.send({ handler: 'middleware' });
});
});
app.installMiddleware();
app.get('/', function(req, res) {
res.send({ handler: 'router' });
});
request(app).get('/')
.expect(200, { handler: 'middleware' })
.end(done);
}
);
it('emits "middleware:error-handlers" after all request handlers',
function(done) {
var logs = [];
app.on('middleware:error-handlers', function() {
app.use(function(err, req, res, next) {
logs.push(req.url);
next(err);
});
});
app.installMiddleware();
request(app).get('/not-found')
.expect(404)
.end(function(err, res) {
if (err) done(err);
expect(logs).to.eql(['/not-found']);
done();
});
}
);
it('installs REST transport', function(done) {
app.model(loopback.Application);
app.set('restApiRoot', '/api');
app.installMiddleware();
request(app).get('/api/applications')
.expect(200, [])
.end(done);
});
});
describe('listen()', function() {
it('starts http server', function(done) {
var app = loopback();

View File

@ -8,7 +8,7 @@ var apiPath = '/api';
app.use(loopback.cookieParser('secret'));
app.use(loopback.token({model: app.models.accessToken}));
app.use(apiPath, loopback.rest());
app.use(app.router);
app.use(loopback.urlNotFound());
app.use(loopback.errorHandler());
app.enableAuth();