我编写了一个函数来创建用户配置文件。
我使用同步模块来摆脱回调 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/