Node.js 具有同步的NodeJs中的错误链

Node.js 具有同步的NodeJs中的错误链,node.js,asynchronous,error-handling,chain,synchronize,Node.js,Asynchronous,Error Handling,Chain,Synchronize,我编写了一个函数来创建用户配置文件 我使用同步模块来摆脱回调地狱 当我这样做时,一切正常: var sql = jsonSql.build({ type: 'insert', table: 'tbl_user', values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: da

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

我使用同步模块来摆脱回调地狱

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

    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;
    }
现在从主函数调用:

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);
    }

});
}
基本上,将回调函数添加到函数参数中,然后在光纤中解析它。

我最终解决了它

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);
    }

});
}
基本上,将回调函数添加到函数参数中,然后在光纤中解析它