node express 异步错误处理?

查看:92
本文介绍了node express 异步错误处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

dao 层 daoUser.js

/**
 *  用户注册
 * @param params
 * @param callback
 */
exports.insert = function (params, callback) {
    let post = Object.assign(params, {date: new Date()});
    pool.query('INSERT INTO user SET ?', post, function (error, results, fields) {
        if (error) throw error;
        for (let key in error) {
            console.log(key + "==" + error[key]);
        }
        console.log(results);
        console.log("============sql===========");
        console.log(fields);
        callback(JSON.parse(JSON.stringify(results)));
    });
}

重复注册导致的唯一约束报错,关键是怎么在外层app.js中去捕获处理。不想所有异步可能出错的地方都加try{}catch 处理

或者从路由层到service层到数据dao层依次把route层的next传递下去?

app.js

//错误处理
app.use(function(err, req, res, next) {
    console.log("=================错误处理=================")
    //其他 业务逻辑

    if (res.headersSent) {
        return next(err);
    }
    res.status(500);
    res.render('error', { error: err });
});

这里并没有捕获数据库操作的异常

解决方案

insert函数模拟异步回调写法,让外层去判断声明函数返回的第一个参数是error还是null。

const insert = (data, cb) => {
    data...
    if(error){
        cb(error);
    }else{
        cb(null, data);
    }
}

对应实例

exports.insert = function (params, callback) {
    let post = Object.assign(params, {date: new Date()});
    pool.query('INSERT INTO user SET ?', post, function (error, results, fields) {
        // 下面改了
        if (error) {
            callback(error);
        for (let key in error) {
            console.log(key + "==" + error[key]);
        }
        console.log(results);
        console.log("============sql===========");
        console.log(fields);
        // 下面改了
        callback(null, JSON.parse(JSON.stringify(results)));
    });
}

外层 express 有(req, res, next) => {}函数,让next()接收insert()函数的返回值,错误最终会传递给APP.js的错误处理中间件,成功执行会跳过。

soonfy

这篇关于node express 异步错误处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆