node.js - Node Js 中带有同步的错误链

标签 node.js asynchronous error-handling chain synchronize

我编写了一个函数来创建用户配置文件。

我使用同步模块来摆脱回调 hell 。

当我这样做时,一切正常:

    var sql = jsonSql.build({
        type: 'insert',
        table: 'tbl_user',
        values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword},
    });

    try {
        var query = sync.await(db.query(sql.query, sql.values, sync.defer()));
    } catch (err) {
        res.status(500).send(err);
        return;
    }

当 sql 发现具有已使用邮件地址的用户时,它会发送错误。完美。

然后我认为将用户写入数据库的代码分开是一个好主意,因为也许您想在管理后端创建一个用户,然后我可以重用较小的函数。

较小的函数:

function createUserInDB(data) {

    var sql = jsonSql.build({
        type: 'insert',
        table: 'tbl_user',
        values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword},
    });

    return db.query(sql.query, sql.values);
}

现在从主函数调用:

try {
        var query = sync.await(userService.createUserInDB(data, sync.defer()));
        console.dir(query);
    } catch(err) {
        console.dir(err);
        res.status(500).send(err);
        return;
    }

这不起作用。

如何在主函数中获取较小函数的结果(作为错误或查询结果),以便我能够使用 try/catch?

最佳答案

终于解决了。

function createUserInDB(data, resolve) {
sync.fiber(function() {

    data.hashedPassword = bcrypt.hashSync(data.password, 10);

    var sql = jsonSql.build({
        type: 'insert',
        table: 'tbl_user',
        values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword},
    });

    try {
        var query = sync.await(db.query(sql.query, sql.values, sync.defer()));
        //first argument would be error
        resolve(null, query);
    } catch(err) {
        resolve(err);
    }

});
}

基本上,将回调函数添加到函数参数中,然后在 Fiber 内解析它。

关于node.js - Node Js 中带有同步的错误链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690432/

相关文章:

javascript - 如何获取 iheartradio 电台的原始流 URL

c++ - TBB流程图条件执行

jquery - jQuery $ .AjaxError检测是否存在自定义错误处理程序

javascript - 为什么我的NodeJS代码会抛出: ECONNRESET error?

scala - 为什么猫的效果异步签名使用 Either[Throwable, A] 而不是 Try[A]?

javascript - grunt-express:socket.io 的配置忽略 http 基础

node.js - 通过其 Web API 获取 OneNote 页面

javascript - 即使元素已被推送,数组仍为空

.net - BeginReceive在单独的线程中

c# - 可以将等待任务分配给操作吗?