Преглед на файлове

feat: 错误捕获完善,mysql数据库操作优化

zhusiqing преди 3 години
родител
ревизия
2566d3007f
променени са 4 файла, в които са добавени 57 реда и са изтрити 7 реда
  1. 9 2
      src/app.ts
  2. 40 4
      src/controllers/index.ts
  3. 6 1
      src/models/index.ts
  4. 2 0
      src/router.ts

+ 9 - 2
src/app.ts

@@ -70,11 +70,18 @@ if (run) {
 
 app.on('error', (err, ctx: Context) => {
   // ctx.$response(err, 'error', false);
-  const errMsg: string = err.message || '服务出错';
+  const errMsg: string = err.stack || err.message || '服务出错';
   console.error('app >>>', err);
-  // console.log(ctx);
+  console.log(ctx.status);
+  ctx.status = 500;
   plugins.logger.formatLog('error', errMsg, ctx);
 });
+// koa捕获不了的
+process.on('uncaughtException', err => {
+  const errMsg: string = err.stack || err.message || '服务出错';
+  console.error('node >>>', err);
+  plugins.logger.formatLog('error', errMsg);
+});
 
 // 注册路由
 app.use(router.routes()).use(router.allowedMethods());

+ 40 - 4
src/controllers/index.ts

@@ -52,11 +52,46 @@ const code = async (ctx: Context): Promise<void> => {
 const register = async (ctx:Context): Promise<void> => {
   const { username, password } = ctx.request.body;
   console.log(username, password);
-  User.create({
-    name: username,
-    password
+  const findUser = await User.findAll({
+    where: {
+      name: username,
+      password
+    }
   });
-  ctx.body = 'ok';
+  if (findUser.length) {
+    ctx.body = ctx.$response(null, '用户已存在', false, 400404);
+  } else {
+    User.create({
+      name: username,
+      password
+    });
+    ctx.body = ctx.$response(null, '创建成功');
+  }
+};
+// 查看错误处理捕获情况
+const chaos = async (ctx: Context): Promise<void> => {
+  const { type } = ctx.params;
+  console.log(type, ' >>>>>');
+  switch (type) {
+    case 'syncErrorThrow':
+      throw new Error('sync error throw');
+      break;
+    case 'thunkErrorThrow':
+      setTimeout(() => {
+        throw new Error('thunk error throw');
+      }, 800);
+      break;
+    case 'promiseError':
+      await new Promise<void>(() => {
+        throw new Error('promise error throw');
+      });
+      break;
+    case 'promiseErrorNext':
+      await new Promise<void>((resolve) => {
+        setTimeout(resolve, 2000);
+      });
+      throw new Error('promise error next');
+  }
 };
 
 export default {
@@ -65,6 +100,7 @@ export default {
   ws,
   upload,
   register,
+  chaos,
   user,
   document,
   bigFileUpload

+ 6 - 1
src/models/index.ts

@@ -1,5 +1,10 @@
 import sequelize from '@/plugins/mysql';
 import userModel from './user';
 export const user = userModel(sequelize);
-sequelize.sync({ alter: true });
+// 如果表不存在,则创建,有则不进行任何操作
+sequelize.sync();
+// 创建表,如果表存在,则删除再创建
+// sequelize.sync({ force: true });
+// 检查数据库中表的当前状态(列和对应数据类型),然后再表中进行必要的更好以使其与模型匹配
+// sequelize.sync({ alter: true });
 

+ 2 - 0
src/router.ts

@@ -34,7 +34,9 @@ const router = new Router<DefaultState, Context>();
 router.get('/', controllers.home);
 router.get('/ws', controllers.ws);
 router.get('/upload', controllers.upload);
+// mysql注册示例
 router.post('/register', controllers.register);
+router.get('/chaos/:type', controllers.chaos);
 
 // api路由以/api前缀
 router.use('/api', apiRouter.routes(), apiRouter.allowedMethods());