diff --git a/lib/context.js b/lib/context.js index 8151258..48c5f71 100644 --- a/lib/context.js +++ b/lib/context.js @@ -3,6 +3,8 @@ * Module dependencies. */ +var createError = require('http-errors'); +var httpAssert = require('http-assert'); var delegate = require('delegates'); var assert = require('assert'); var http = require('http'); @@ -49,6 +51,21 @@ var proto = module.exports = { } }, + /** + * Similar to .throw(), adds assertion. + * + * this.assert(this.user, 401, 'Please login!'); + * + * See: https://github.com/jshttp/http-assert + * + * @param {Mixed} test + * @param {Number} status + * @param {String} message + * @api public + */ + + assert: httpAssert, + /** * Throw an error with `msg` and optional `status` * defaulting to 500. Note that these are user-level @@ -61,31 +78,16 @@ var proto = module.exports = { * this.throw(new Error('invalid'), 400); * this.throw(400, new Error('invalid')); * + * See: https://github.com/jshttp/http-errors + * * @param {String|Number|Error} err, msg or status * @param {String|Number|Error} [err, msg or status] * @param {Object} [props] * @api public */ - throw: function(msg, status, props){ - if ('object' == typeof status && !(status instanceof Error)) { - props = status; - status = null; - } - - if ('number' == typeof msg) { - var tmp = msg; - msg = status || http.STATUS_CODES[tmp]; - status = tmp; - } - - props = props || {}; - - var err = msg instanceof Error ? msg : new Error(msg); - for (var key in props) err[key] = props[key]; - err.status = status || err.status || 500; - err.expose = 'number' == typeof err.status && http.STATUS_CODES[err.status] && err.status < 500; - throw err; + throw: function(){ + throw createError.apply(null, arguments); }, /** diff --git a/package.json b/package.json index 1c8c172..def1965 100644 --- a/package.json +++ b/package.json @@ -18,26 +18,28 @@ ], "license": "MIT", "dependencies": { - "escape-html": "~1.0.1", - "statuses": "~1.0.1", "accepts": "~1.1.0", - "type-is": "~1.5.0", - "mime-types": "~2.0.0", - "media-typer": "~0.3.0", - "on-finished": "~2.1.0", "co": "~3.1.0", "content-disposition": "~0.1.0", - "debug": "*", - "fresh": "~0.2.1", - "koa-compose": "~2.3.0", - "koa-is-json": "~1.0.0", "cookies": "~0.5.0", + "debug": "*", "delegates": "0.0.3", "destroy": "~1.0.3", "error-inject": "~1.0.0", - "vary": "~1.0.0", + "escape-html": "~1.0.1", + "fresh": "~0.2.1", + "http-assert": "~1.0.1", + "http-errors": "~1.2.0", + "koa-compose": "~2.3.0", + "koa-is-json": "~1.0.0", + "media-typer": "~0.3.0", + "mime-types": "~2.0.0", + "on-finished": "~2.1.0", + "only": "0.0.2", "parseurl": "~1.3.0", - "only": "0.0.2" + "statuses": "~1.0.1", + "type-is": "~1.5.0", + "vary": "~1.0.0" }, "devDependencies": { "istanbul-harmony": "~0.3.0", diff --git a/test/context/assert.js b/test/context/assert.js new file mode 100644 index 0000000..04a7980 --- /dev/null +++ b/test/context/assert.js @@ -0,0 +1,17 @@ + +var context = require('../context'); +var assert = require('assert'); + +describe('ctx.assert(value, status)', function(){ + it('should throw an error', function(){ + var ctx = context(); + + try { + ctx.assert(false, 404); + throw new Error('asdf'); + } catch (err) { + assert(404 == err.status); + assert(err.expose); + } + }) +})