Kaynağa Gözat

Use new error handler for DRYer code, adding status into error message object

sbkwgh 7 yıl önce
ebeveyn
işleme
f5fbd78e57
3 değiştirilmiş dosya ile 53 ekleme ve 27 silme
  1. 21 0
      lib/errorHandler.js
  2. 25 21
      lib/errors.js
  3. 7 6
      server.js

+ 21 - 0
lib/errorHandler.js

@@ -0,0 +1,21 @@
+let { Sequelize } = require('../models')
+let Errors = require('./errors')
+
+module.exports = function (err, req, res, next) {
+	if(err instanceof Sequelize.ValidationError) {
+		res.status(400)
+		res.json(err)
+	} else if(err.name in Errors) {
+		res.status(err.status)
+		res.json({
+			errors: [err]
+		})
+	} else {
+		console.log(err)
+
+		res.status(500)
+		res.json({
+			errors: [Errors.unknown]
+		})
+	}
+}

+ 25 - 21
lib/errors.js

@@ -1,35 +1,35 @@
 let Errors = {
-	unknown: 'An unknown error occured on our end. Please try again later',
-	accountAlreadyCreated: 'This account has already been created',
-	categoryAlreadyExists: 'This category has already been created',
-	accountDoesNotExist: 'This account does not exist',
-	invalidCategory: 'This category does not exist',
-	invalidLoginCredentials: 'Invalid login credentials were provided',
-	requestNotAuthorized: 'The request was not authorized',
-	invalidToken: 'The token provided was not valid',
-	noSettings: 'You haven\'t added any settings yet',
-	passwordSame: 'You can\'t set it to the same password',
-	cannotLikeOwnPost: 'You can\'t like your own post',
-	threadLocked: 'You can\'t post to a locked thread',
-	postRemoved: 'You can\'t reply to a removed post',
+	unknown: ['An unknown error occured on our end. Please try again later', 500],
+	accountAlreadyCreated: ['This account has already been created', 400],
+	categoryAlreadyExists: ['This category has already been created', 400],
+	accountDoesNotExist: ['This account does not exist', 400],
+	invalidCategory: ['This category does not exist', 400],
+	invalidLoginCredentials: ['Invalid login credentials were provided', 401],
+	requestNotAuthorized: ['The request was not authorized', 401],
+	invalidToken: ['The token provided was not valid', 401],
+	noSettings: ['You haven\'t added any settings yet', 500],
+	passwordSame: ['You can\'t set it to the same password', 400],
+	cannotLikeOwnPost: ['You can\'t like your own post', 400],
+	threadLocked: ['You can\'t post to a locked thread', 400],
+	postRemoved: ['You can\'t reply to a removed post', 400],
 	invalidParameter (param, message) {
 		if(message) {
 			var punctuatedMessage = ': ' + message
 		}
 
-		return `${param} is invalid${punctuatedMessage}`
+		return [`${param} is invalid${punctuatedMessage}`, 400]
 	},
 	missingParameter (param) {
-		return `Missing ${param}`
+		return [`Missing ${param}`, 400]
 	},
 	invalidParameterType (param, type) {
-		return `${param} must be of type ${type}`
+		return [`${param} must be of type ${type}`, 400]
 	},
 	parameterLengthTooSmall (param, length) {
-		return `${param} must be more than ${length} characters in length`
+		return [`${param} must be more than ${length} characters in length`, 400]
 	},
 	parameterLengthTooLarge (param, length) {
-		return `${param} must be less than ${length} characters in length`
+		return [`${param} must be less than ${length} characters in length`, 400]
 	}
 }
 
@@ -39,17 +39,21 @@ function processErrors(errorName) {
 
 	if(typeof Errors[errorName] === 'function') {
 		temp = function() {
-			let message = Errors[errorName](...arguments)
+			let arr = Errors[errorName](...arguments)
 			return {
 				name: errorName,
-				message: message,
+				message: arr[0],
+				status: arr[1],
 				parameter: arguments[0]
 			}
 		}
 	} else {
+		let arr = Errors[errorName]
+
 		temp = {}
 		temp.name = errorName
-		temp.message = Errors[errorName]
+		temp.message = arr[0]
+		temp.status = arr[1]
 	}
 
 	return temp

+ 7 - 6
server.js

@@ -1,7 +1,7 @@
 let express = require('express')
 let app = express()
 
-let sequelize = require('./models').sequelize
+let { sequelize } = require('./models')
 let sockets = require('./lib/sockets')
 
 let config = require('./config/server.js')
@@ -18,6 +18,10 @@ let session = expressSession({
 	resave: true,
 	saveUninitialized: true
 })
+if(process.env.NODE_ENV === 'production') {
+	app.set('trust proxy', 1);
+	session.cookie.secure = 'auto'
+}
 
 app.use(compression())
 app.use(bodyParser.json({ limit: '5mb' }))
@@ -27,12 +31,7 @@ app.use(session)
 if(process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'production') {
 	app.use(require('morgan')('dev'))
 }
-/*if(process.env.NODE_ENV === 'production') {
-	app.set('trust proxy', 1);
 
-	console.log(session)
-	session.cookie.secure = 'auto'
-}*/
 
 app.use('/api/v1/user', require('./routes/user'))
 app.use('/api/v1/admin_token', require('./routes/admin_token'))
@@ -52,6 +51,8 @@ app.get('*', (req, res) => {
 	res.sendFile(path.join(__dirname, 'frontend', 'dist', 'index.html'))
 })
 
+app.use(require('./lib/errorHandler'))
+
 function main () {
 	let server = app.listen(config.port, () => {
 		console.log('Listening on ' + config.port)