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 前端开发
计算机node项目|nodejs网上书城设计与实现
计算机node项目|nodejs网上书城设计与实现
176 2
|
21天前
|
JavaScript 前端开发 API
深入浅出:使用Node.js搭建RESTful API的实践之旅
【8月更文挑战第31天】本文将带你踏上一次Node.js的探险之旅,通过实际动手构建一个RESTful API,我们将探索Node.js的强大功能和灵活性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的实践经验和深刻的技术洞见。
|
1月前
|
存储 缓存 JavaScript
深入Node.js身份验证:策略与实践
【8月更文挑战第20天】
44 4
|
29天前
|
JavaScript 安全 前端开发
Node.js身份验证全攻略:策略与实践,打造坚不可摧的Web应用安全防线!
【8月更文挑战第22天】Node.js作为强大的服务器端JavaScript平台,对于构建高效网络应用至关重要。本文探讨其身份验证策略,涵盖从基于token至复杂的OAuth 2.0及JWT。Passport.js作为认证中间件,支持本地账号验证及第三方服务如Google、Facebook登录。同时介绍JWT轻量级验证机制,确保数据安全传输。开发者可根据应用需求选择合适方案,注重安全性以保护用户数据。
31 1
|
1月前
|
缓存 JavaScript 前端开发
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
这篇文章介绍了如何解决npm版本与Node.js版本不兼容的问题,提供了查看当前npm和Node.js版本的步骤,以及如何根据Node.js版本选择合适的npm版本并进行升级的详细指导。
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
|
26天前
|
JavaScript
【Azure Function App】Nodejs Function遇见WorkerProcessExitException : node exited with code -1073740791 (0xC0000409) 错误
【Azure Function App】Nodejs Function遇见WorkerProcessExitException : node exited with code -1073740791 (0xC0000409) 错误
|
2月前
|
Web App开发 存储 JavaScript
前端如何学习Node.js及Node.js的主要用途
【7月更文挑战第16天】 学习Node.js对前端开发者至关重要,涉及理解其基于V8的运行时环境、JavaScript基础、安装与验证、核心模块(如fs、http、path)及npm管理。实践项目,如用Express建服务器,参与开源,深入学习异步编程和事件循环。Node.js用于服务器开发、构建工具、本地开发服务器和实时应用,提升全栈能力。借助官方文档和各种资源加速学习。
49 4
|
2月前
|
JavaScript 前端开发 API
Node中的AsyncLocalStorage 使用问题之Node.js将 JavaScript 层的 nativeHooks 注册到 C++ 层的问题如何解决
Node中的AsyncLocalStorage 使用问题之Node.js将 JavaScript 层的 nativeHooks 注册到 C++ 层的问题如何解决
|
2月前
|
监控 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
|
3月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践