2017-12-08 15 views
1

약속에 대한 나의 이해가 완벽하지 않습니다.
그래서 어떤 코드가 오류 및 예외 상황을 처리하는 올바른 방법인지 잘 모르겠습니다.try-catch 또는 promise.catch로 promise.reject 처리

코드를 올바르게 작성하는 데 도움이됩니다.

첫 번째. 시도 - 시도 - 캐치 sequelizer의 promise.catch를 잡을 수 있다면 캐치를 sequelizer의 promise.reject이 들어

async function doGetAdminList(adminName) { 

     let adminList; 
     try { 
     adminList = await sequelize.query(
      sqls.GET_ADMIN_LIST, 
      { replacements: { adminName: adminName }, type: sequelize.QueryTypes.SELECT } 
     ); 
     } catch (e) { 
     return Promise.reject({status:500, message: "SQL Error" }); 
     }  

     if (!adminList || !Object.keys(adminList).length) { 
     log.info('\nadminList not found :\n'); 
     return Promise.reject({status:400, message: 'adminList not found.' }) 
     } 

     return adminList; 
    } 

에 대해 궁금().

2nd. sequelizer의 promise.reject이 들어

async function doGetAdminList(adminName) { 
      let adminList; 
      adminList = await sequelize.query(
       sqls.GET_ADMIN_LIST, 
       { replacements: { adminName: adminName }, type: sequelize.QueryTypes.SELECT } 
     ); 

      if (!adminList || !Object.keys(adminList).length) { 
      log.info('\nadminList not found :\n'); 
      return Promise.reject({status:400, message: 'adminList not found.' }) 
      } 

      return adminList; 
     } 

을 처리하지 않는, 나는 sequelizer의 promise.reject()가 호출 기능을 전달() promise.catch에 발신자의 사로 잡았 할 수 있는지 궁금합니다.

위의 sequelize-using 함수는 express 함수 아래에서 사용됩니다.

const jwtAuth = require('../common/jwtAuth.js'); 

exports.getAdminList = function (req, res) { 
    res.setHeader("Content-Type", "application/json; charset=utf-8"); 

    if (!req.body.adminName) { 
    return res.status(400).json({ message: 'adminName is empty.' }); 
    } 

    jwtAuth(req.headers.accesstoken) 
    .then((decoded) => { 
    worker = decoded.loginName; 
    return doGetAdminList(adminName); 
    }) 
    .then((adminList) => { 
    log.info("getAdminList() finish"); 
    res.status(200).json(adminList); 
    }) 
    .catch(e => { 
    log.error(e); 
    return res.status(e.status).json(e); 
    }); 
}; 

jwtAuth.js

adminController.js 기능을 약속이기도합니다.

const jwt = require('jsonwebtoken'); 
module.exports = async function verifyJwt(token) { 
    return await new Promise((resolve, reject) => { 
    if (!token) { 
     reject({status:401, message:'Empty token'}); 
     return; 
    } 

    jwt.verify(token,"dipa",function(err, decoded){ 
     if(err) { 
     reject({status:401, message:'TokenExpiredError'}); 
     } else { 
     resolve(decoded); 
     } 
    }); 
    }); 
} 
+0

내부와 getAdminList을 할 경우 'async function'을 사용한다면'return Promise '대신'throw'를 사용하십시오.거부 ' – Bergi

+0

당신의 질문은 "* 나는 오류를 잡아서는 안되나, 잡아서 다른 오류를 다시 범하는 것이 좋을 것"이라고 생각한다. 'sequelize.query'가'status'를 가진 객체를 거부하지 않으면, sql 에러를 포착하지 않는 버전은 작동하지 않습니다. – Bergi

+0

@Bergi 네, 네 말이 맞아. 나는 거부에 대한 catch 예외를 완전히 오해 할 수도있다. – sungyong

답변

0

'비동기'사용할 필요가 없습니다 async 함수는 Promise를 반환하기 때문에 함수는 약속을 반환하는 경우.

내가 말하고자하는 것은 var somethink = await doSomethink()의 결과는 그 객체가 약속이 아니며 async 함수에서 반환하기 때문에 Promise.resolve(somethink)으로 반환됩니다.

은 그래서 'jwtAuth.js'은 더없이

const jwt = require('jsonwebtoken'); 
module.exports = function verifyJwt(token) { 
    return new Promise((resolve, reject) => { 
    if (!token) { 
     reject({status:401, message:'Empty token'}); 
     return; 
    } 

    jwt.verify(token,"dipa",function(err, decoded){ 
     if(err) { 
     reject({status:401, message:'TokenExpiredError'}); 
     } else { 
     resolve(decoded); 
     } 
    }); 
    }); 
} 

동일은

function doGetAdminList(adminName) { 

    let adminList; 

    return sequelize.query(
    sqls.GET_ADMIN_LIST, { 
     replacements: { 
     adminName: adminName 
     }, 
     type: sequelize.QueryTypes.SELECT 
    } 
).catch((e)=> { 
    //here you catch you sequelize error which can be anything 
    //you can either catch and throw a new Error 
    log.info('\nadminList not found :\n'); 
    throw Error({ 
     status: 500, 
     message: "SQL Error" 
    }) 
    }) 

} 

소개 getAdminList과 끝에 catch 간다.

jwtAuth 또는 doGetAdminList이 오류 .catch을 던집니다. 오류가 발생합니다. doGetAdminList 당신이 sequelize.query.catch을 해달라고하면

다음 sequelize error 여기에 catch에 여행 할 것이다. 그러나 오류를 처리하고 오류를 다시 제기하려는 경우 가능합니다. 당신은 싶어 오류를 변경 해달라고하지만 당신은 싶어 로그 및 오류를 passthroud 당신이 그것을 또한

.catch(function(e) { 
    log.info('\nadminList not found :\n'); 
    throw e; 
    }) 

을 다시 던진다 경우, 추가

const jwtAuth = require('../common/jwtAuth.js'); 

exports.getAdminList = function (req, res) { 
    res.setHeader("Content-Type", "application/json; charset=utf-8"); 

    if (!req.body.adminName) { 
    res.status(400).json({ message: 'adminName is empty.' }); 
    } 

    jwtAuth(req.headers.accesstoken) 
    .then((decoded) => { 
    worker = decoded.loginName; 
    return doGetAdminList(adminName); 
    }) 
    .then((adminList) => { 
    log.info("getAdminList() finish"); 
    res.status(200).json(adminList); 
    }) 
    .catch(e => { 
    //the message with mess "SQL Error" will travel here. 
    log.error(e); 
    res.status(e.status).json(e); 
    }); 
}; 

당신 싶어 async/await

exports.getAdminList = async function(req, res) { 
    res.setHeader("Content-Type", "application/json; charset=utf-8"); 

    if (!req.body.adminName) 
    res.status(400).json({message: 'adminName is empty.'}); 

    try { 

    let decoded = await jwtAuth(req.headers.accesstoken) 
    worker = decoded.loginName; 

    let adminList = await doGetAdminList(req.body.adminName); 
    log.info("getAdminList() finish"); 

    res.status(200).json(adminList); 

    } catch (e) { 
    //the message with mess "SQL Error" will travel here. 
    log.error(e); 
    res.status(e.status).json(e); 
    } 

}; 
+0

'async' /'await'를 사용할 수있는 경우'then' 체인을 사용할 이유가 없습니까? 물론,'verifyJwt'에서는 불필요한 것이지만,'adminlist'에서는 상당히 유익합니다. – Bergi