getErrorMessage.mjs

import isErr from './isErr.mjs'
import isobj from './isobj.mjs'
import isarr from './isarr.mjs'
import isstr from './isstr.mjs'
import cstr from './cstr.mjs'
import haskey from './haskey.mjs'


/**
 * 提取Error內Message訊息
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/getErrorMessage.test.mjs Github}
 * @memberOf wsemi
 * @param {Error} err 傳入錯誤訊息
 * @returns {String} 回傳錯誤訊息的message字串
 * @example
 *
 * try {
 *     throw new Error('something wrong')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => something wrong
 *
 * try {
 *     throw new Error()
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => ''
 *
 * try {
 *     throw new TypeError('wrong type')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => wrong type
 *
 * try {
 *     throw new RangeError('range bad')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => range bad
 *
 * try {
 *     throw new ReferenceError('ref bad')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => ref bad
 *
 * try {
 *     throw new SyntaxError('syntax bad')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => syntax bad
 *
 * try {
 *     throw new URIError('uri bad')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => uri bad
 *
 * try {
 *     throw new AggregateError([new Error('e1'), 'e2'], 'outer')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => outer
 *
 * try {
 *     throw new Error('top', { cause: new Error('root cause') })
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => top
 *
 * try {
 *     throw new DOMException('operation was aborted.', 'AbortError')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => operation was aborted.
 *
 * try {
 *     throw fs.readFileSync('definitely_not_exists_1234567890.txt')
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => ENOENT: no such file or directory, open ...
 *
 * let test1 = async() => {
 *     return Promise.reject('promise reject')
 * }
 * try {
 *     await test1()
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => promise reject
 *
 * let test2 = async() => {
 *     throw new Error('something wrong')
 * }
 * try {
 *     await test2()
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => something wrong
 *
 * let test3 = async() => {
 *     throw new Error()
 * }
 * try {
 *     await test3()
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => ''
 *
 * let test4 = async() => {
 *     throw new TypeError('wrong type')
 * }
 * try {
 *     await test4()
 * }
 * catch (err) {
 *     console.log(getErrorMessage(err))
 * }
 * // => wrong type
 *
 */
function getErrorMessage(err) {

    let errMsg = ''
    if (isErr(err)) { //err instanceof Error
        // console.log(`instanceof(err)`)
        errMsg = err.message
    }
    else if (isstr(err)) {
        // console.log(`isstr(err)`)
        return err
    }
    else if (isobj(err)) {
        // console.log(`isobj(err)`)
        if (haskey(err, 'message')) {
            return err.message
        }
        else {
            return JSON.stringify(err)
        }
    }
    else if (isarr(err)) {
        // console.log(`isarr(err)`)
        return JSON.stringify(err)
    }
    else {
        // console.log(`cstr(err)`)
        errMsg = cstr(err)
    }

    return errMsg
}


export default getErrorMessage