NodeJS 实践:利用Node Async 解决 Callback Hell

简介: 在两年前的一个 MEAN 技术栈项目中曾经有过这样的一段的代码... Callback Hell 代码片段 UserLogin.findOne({email:email}) .populate({ path: 'toParty', select: 'fullname roleTypes'

在两年前的一个 MEAN 技术栈项目中曾经有过这样的一段的代码...

Callback Hell 代码片段

UserLogin.findOne({email:email})
.populate({
path: 'toParty',
select: 'fullname roleTypes'
})
.exec(function(err, result){
  if(err)
    return res.send(500,{msg:err});
  if(result===null)
    return res.send(401,{msg:'Malformed Credential'});
    loginAudit.userFullname = result.toParty.fullname;
  if('normal'!=result.lastStatus){
    ...
  loginAudit.save(function(err){
      if(err) return res.send(500,{msg:err});
      res.send(401,{msg:'Malformed Credential'});
    });
  }else{
    bcrypt.hash(password, result.salt ,function(err, hash){
    if(err)
      return res.send(500,{msg:err});
    if(result.password!=hash){
      ...
    }else{
      ...
    loginAudit.save(function(err){
    if(err) return res.send(500,{msg:err});
      ...
    result.save(function(err){
      if(err) return res.send(500,{msg:err});
    ...
    ...
  }
}    

这样的代码段,不仅可读性差,而且可能还会面临像 RangeError: Maximum call stack size exceeded 的问题。

使用 Async.js 进行了重写

async.waterfall([
// step 1
function(next){
UserLogin.findOne({email:email})
.populate({
    path: 'toParty',
    select: 'fullname roleTypes'
})
.exec(function(err, result){
    next(err, result);
})
},
// step 2
function(result, next){
if(!result)
    return next(new TuracoError('UserLogin NotFound'));
loginAudit.userFullname = result.toParty.fullname;
if('normal'!=result.lastStatus){
    ...
}else{
    next(null,result);
}
},
// step 3
function(result, next){
bcrypt.hash(password, result.salt ,function(err, hash){
    if(err)return next(err);
    if(result.password!=hash){
        ...
    }else{
        next(null, result);
    }
});    
},
// step 4
function(result, next){
...
loginAudit.save(function(err){
    if(err)return next(err);
    ...
    result.save(function(err){
        if(err)return next(err);
        ...
        next(null, token, rs);
    });
});
}
// finally
],function(err, token, rs){
if(err){
...
}else{
res.cookie('yourcookiekey',token,{
    signed:true,
    maxAge:86400000
});
res.send(200,rs);    
}        

自我感觉好多了:)

从一个坑里爬出来,准备好掉入下一个坑了吗?

目录
相关文章
|
3月前
|
JavaScript
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
27 0
|
6月前
|
Web App开发 JavaScript 前端开发
2023Node.js零基础教程(小白友好型),nodejs新手到高手,(一)NodeJS入门
2023Node.js零基础教程(小白友好型),nodejs新手到高手,(一)NodeJS入门
168 0
|
4月前
|
JSON JavaScript API
Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
75 0
|
3月前
|
JavaScript 前端开发 API
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
35 0
|
3月前
|
存储 缓存 资源调度
深入浅出Node.js中的node_modules(二)
深入浅出Node.js中的node_modules
|
6月前
|
缓存 JavaScript
【Node】node.js安装与配置(详细步骤)
【Node】node.js安装与配置(详细步骤)
388 0
|
1月前
|
JavaScript 前端开发 Serverless
函数计算新功能— 支持 Node.js 18 、Node.js 20 运行时
从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。
459 0
|
5月前
|
JavaScript NoSQL MongoDB
mongodb踩坑- C:\Program Files\nodejs\node_cache\_logs\2019-01-08T08_49_25_665Z-debug.log
mongodb踩坑- C:\Program Files\nodejs\node_cache\_logs\2019-01-08T08_49_25_665Z-debug.log
38 0
|
5月前
|
JavaScript Windows
Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 1x.x
Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 1x.x
38 0