Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

async/await封装使用mysql 中错误处理的问题 #2

Closed
nodejh opened this issue Feb 28, 2017 · 5 comments
Closed

async/await封装使用mysql 中错误处理的问题 #2

nodejh opened this issue Feb 28, 2017 · 5 comments

Comments

@nodejh
Copy link

nodejh commented Feb 28, 2017

https://github.com/ChenShenhai/koa2-note/blob/master/note/mysql/async.md

下面的代码中,如果创建连接失败,应该是 reject( err ) 吧?

pool.getConnection(function(err, connection) {
      if (err) {
        // 这里我觉得应该是 reject( err ),而不是 resolve。
        resolve( err )
      } else {
        // ...
@chenshenhai
Copy link
Owner

谢谢指正错误,已经修改好了,O(∩_∩)O!

@nodejh
Copy link
Author

nodejh commented Mar 2, 2017

https://github.com/ChenShenhai/koa2-note/blob/master/note/mysql/async.md

这个文件还没改过来呢

@chenshenhai
Copy link
Owner

谢谢提醒,改好了,O(∩_∩)O

@jackgreentemp
Copy link

msyql发生异常时,只在db-utils.js中调用reject(),但是没有在上层调用的地方捕获异常,会触发unhandledpromiserejectionwarning。
教程中的demo好像对这部分没有进行说明(mysql部分也没有),是否可以补充一下?

@jackgreentemp
Copy link

jackgreentemp commented Nov 16, 2017

db-utils.js中增加catch,实现全局处理

let query = function( sql, values ) {

  return new Promise(( resolve, reject ) => {
    pool.getConnection(function(err, connection) {
      if (err) {
        resolve( err )
      } else {
        connection.query(sql, values, ( err, rows) => {

          if ( err ) {
            reject( err )
          } else {
            resolve( rows )
          }
          connection.release()
        })
      }
    })
  }).catch((e) => {
    console.log("mysql error")
    console.log(e)
  })

}

或者在models里进行局部处理

/**
     * 更新username
     * @param  {object} model 用户数据模型
     * @return {object}       mysql执行结果
     */
    async setUserName (model) {
        let _sql = "UPDATE ?? SET ? WHERE id = ?"
        let result = await dbUtils.query(_sql, [ 'user', {names: model.name}, model.userId ] ).catch((e) => {
            console.log("setUserName mysql error")
            console.log(e)
        })
        return result
    },

但是有一个问题,再捕获到异常后,怎么将异常提示给controller并返回,有什么好的处理方式?
一个笨办法就是:models返回promise给services,services中返回promise给controllers,在controller中catch异常,使用ctx.throw()把error抛给app.js中进行全局处理

app.js中错误处理,可以参考阮一峰老师的例子
https://github.com/ruanyf/koa-demos/blob/master/demos/16.js
引用阮老师的教程:为了方便处理错误,最好使用try...catch将其捕获。但是,为每个中间件都写try...catch太麻烦,我们可以让最外层的中间件,负责所有中间件的错误处理。

const handler = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.response.status = err.statusCode || err.status || 500;
    ctx.response.body = {
      message: err.message
    };
  }
};

const main = ctx => {
  ctx.throw(500);
};

app.use(handler);
app.use(main);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants