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月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
79 1
|
2月前
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
84 9
|
3月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
3月前
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
3月前
|
JavaScript 前端开发 开发工具
Node.js——初识Node.js
Node.js——初识Node.js
62 4
|
4月前
|
JavaScript 前端开发 开发者
掌握Node.js中的异步编程:从回调到async/await
Node.js的异步编程模型是其核心特性之一,它使得开发者能够构建高性能和高并发的应用程序。本文将带你从Node.js的异步编程基础开始,逐步深入到回调函数、Promises、以及最新的async/await语法。我们将探讨这些异步模式的原理、使用场景和最佳实践,并通过实例代码展示如何在实际项目中应用这些概念。
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
4月前
|
Web App开发 JavaScript API
构建高效后端系统:Node.js与Express框架的实践之路
【9月更文挑战第37天】在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据处理和业务逻辑的重要职责。本文将深入探讨如何利用Node.js及其强大的Express框架来搭建一个高效、可扩展的后端系统。我们将从基础概念讲起,逐步引导读者理解并实践如何设计、开发和维护一个高性能的后端服务。通过实际代码示例和清晰的步骤说明,本文旨在为初学者和有经验的开发者提供一个全面的指南,帮助他们在后端开发的旅途上走得更远。
69 3
|
4月前
|
缓存 监控 JavaScript
Node.js中基于node-schedule实现定时任务之详解
Node.js中基于node-schedule实现定时任务之详解
170 0
|
4月前
|
Web App开发 JSON JavaScript
深入浅出:Node.js后端开发入门与实践
【10月更文挑战第4天】在这个数字信息爆炸的时代,了解如何构建一个高效、稳定的后端系统对于开发者来说至关重要。本文将引导你步入Node.js的世界,通过浅显易懂的语言和逐步深入的内容组织,让你不仅理解Node.js的基本概念,还能掌握如何使用它来构建一个简单的后端服务。从安装Node.js到实现一个“Hello World”程序,再到处理HTTP请求,文章将带你一步步走进Node.js的大门。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往后端开发新世界的大门。

热门文章

最新文章