`
yuyongkun4519
  • 浏览: 42657 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Express中如何使用async/await

 
阅读更多

随着Node.js v7.6.0版本开始支持async/await,在服务器端进行Node.js编程也终于有了最佳的异步解决方案。

 

只要你Node.js安装的是v7.6.x以上版本,都是支持async/await语法的。

所以只要你安装的是Node.js新版本,在Express程序里面是可以直接使用async/await方法的。

 

参考下面实例:

 

const express = require('express');
const app = express();
const fs = require('fs');
function readFileAsync(filepath) {
	return new Promise(function (resolve, reject) {
		fs.readFile(filepath, function (err, data) {
			if (err) {
				reject(err);
				return;
			}
			resolve(JSON.parse(data.toString()));
		});
	});
}
app.get('/', async (req, res, next) => {
	const data = await readFileAsync('./test.json');
	res.send(data.worlds);

});
// Error Handler
app.use(function (err, req, res, next) {
	console.error('Error:', err);
	res.status(500).send(err.message);
});
const server = app.listen(3000, () => {
	let port = server.address().port;
	console.log(`server is running on port ${port}`);
});

 

代码可以正常执行,通过实例发现不对express进行任何改造async/await也能使用,现在我们读取一个不存在的文件看看存在的问题。

 

const data = await readFileAsync('./test2.json');
 
此时会发生请求不能及时响应,过一段时间出现UnhandledPromiseRejectionWarning的错误提示,这是因为async函数里面的错误默认不能被错误中间件捕获的原因。

 

怎么才能捕获async函数里面的错误呢?

解决方法:

1,添加try/catch

app.get('/', async (req, res, next) => {
try{
   const data = await readFileAsync('./test2.json');
   res.send(data.worlds);
}catch(err){
   next(err);
}
});

 

运行发现此时错误可以被错误中间件捕获处理了,如果在所有可能出现错误的地方的都添加try/catch,代码看起来就太不优雅精简了,更好一点的方式就是写一个方法可以自动捕获async函数里面的错误。

 

2,使用Promise对象

因为async函数默认返回的是一个Promise对象,所以可以用下面的asyncHandler函数捕获async函数中出现的异常错误。

 

//执行捕获异常错误
const asyncHandler = function (fn) {
	return function (...args) {
		Promise.resolve(fn(...args)).catch(args[2]);
	}
}

app.get('/', asyncHandler(async (req, res, next) => {
	const data = await readFileAsync('./test2.json');
	res.send(data.worlds);
}));
 

 

不过这些实现代码看起来还是怪怪的,每个用到的地方都要添加asyncHandler函数,这是作为一个有追求的程序员不能忍受的,我们要追求更极致的方式。

 

3,更精简的实现方式是我们可以通过修改express的底层router来实现:

 

const Layer = require('express/lib/router/layer');
Object.defineProperty(Layer.prototype, 'handle', {
	enumerable: true,
	get() {
		return this.__handle;
	},
	set(fn) {
		if (fn.length === 4) {
			this.__handle = fn;
		} else {
			this.__handle = (req, res, next) =>
				Promise.resolve(fn(req, res, next)).catch(next);
		}
	},
});

 

 这样修改之后就可以全局捕获express路由async函数中出现的异常错误了,下面是完整的代码:

 

const express = require('express');
const app = express();
const fs = require('fs');
function readFileAsync(filepath) {
	return new Promise(function (resolve, reject) {
		fs.readFile(filepath, function (err, data) {
			if (err) {
				reject(err);
				return;
			}
			resolve(JSON.parse(data.toString()));
		});
	});
}
const Layer = require('express/lib/router/layer');
Object.defineProperty(Layer.prototype, 'handle', {
	enumerable: true,
	get() {
		return this.__handle;
	},
	set(fn) {
		if (fn.length === 4) {
			this.__handle = fn;
		} else {
			this.__handle = (req, res, next) =>
				Promise.resolve(fn(req, res, next)).catch(next);
		}
	},
});
app.get('/', async (req, res, next) => {
	const data = await readFileAsync('./test2.json');
	res.send(data.worlds);
});
// Error Handler
app.use(function (err, req, res, next) {
	console.error('Error:', err);
	res.status(500).send(err.message);
});
const server = app.listen(3000, () => {
	let port = server.address().port;
	console.log(`server is running on port ${port}`);
});

 

so easy...^_^

 

分享到:
评论

相关推荐

    详解如何让Express支持async/await

    既然 Koa 2 已经支持 async/await 中间件了,为什么不直接用 Koa,而还要去改造 Express 让其支持 async/await 中间件呢?因为 Koa 2 正式版发布才不久,而很多老项目用的都还是 Express,不可能将其推倒用 Koa 重写...

    node基于async/await对mysql进行封装

    但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作封装,让查询更加方便。(node版本需>=7.0)。 原理 简单来说,async/await的实现原理是基于promise,根据promise...

    【JavaScript源代码】express异步函数异常捕获示例详解.docx

     在express中时使用 Async/await 编写异步代码时,每个 async 函数都要包裹在try/catch中,代码量多了看着冗余不优雅,express又不像koa的异步机制可以订阅全局的error事件,为了解决这个问题,需要写个捕获异步...

    NodeJs通过async/await处理异步的方法

    我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数。我们来模拟一个Mongo数据库的操作,感受一下。 mongoDb.open...

    koa2starter使用mysql和gulp并且包含asyncawait特性pm2部署和express风格的中间件

    A koa2 starter by using mysql, gulp includes async/await, pm2, express-style middlewares. koa2 starter,使用mysql和gulp,并且包含async/await特性、pm2部署和express风格的中间件

    async-wrapper-express-ts:Typescript源包装异步Express路由的简单功能

    此npm模块允许您在打字稿源中使用此解决方案。 安装 # With npm npm install --save async-wrapper-express-ts # With yarn yarn add async-wrapper-express-ts 用法 import asyncWrapper from 'asyncWrapper' .....

    awaitjs-express:使用asyncawait编写Express中间件和路由处理程序

    @ awaitjs / express 使用async / await编写Express中间件和路由处理程序用法const { addAsync } = require ( '@awaitjs/express' ) ;// Or, if you want to use `wrap()`const { wrap } = require ( '@awaitjs/...

    用 Express 和 Vue3 搭建的 ChatGPT 演示网页

    当然,我很乐意为您提供详细的代码说明。以下是对您提供的使用 Express 和 Vue3 搭建的 ChatGPT 演示网页代码的 500 字说明: ...由于 ChatGPT API 有一定的延迟,服务器使用了 async/await 语法来等待 API 的响应。

    express-async-errors

    表达异步错误此仓库与我的博客文章有关使用async / await进行Express错误处理的文章一起显示。 相关代码在src/app.js 。 此存储库还包含涉及Babel,ESLint,Prettier等的设置-

    koa-to-express:在ExpressKoa应用程序中使用KoaExpress中间件

    在Express / Koa应用程序中使用Koa / Express中间件。 它可以将中间件转换为Express和koa中间件之间的另一种形式。 需求 Koa-to-express需要koa@2.0.0和express@4.0.0或更高。 如果要使用ES2015的async / await...

    express异步函数异常捕获示例详解

    在express中时使用 Async/await 编写异步代码时,每个 async 函数都要包裹在try/catch中,代码量多了看着冗余不优雅,express又不像koa的异步机制可以订阅全局的error事件,为了解决这个问题,需要写个捕获异步函数...

    7-wechat-movie:2年前的《 7天搞定Node.js微信公众号》源代码

    因为最新的node从v7.6.0开始已经支持async / await等语法了,所以我们可以放心的直接使用async / await,而不需要babel等编译 包裹 首先需要配置新的package.json { "name" : "wechat" , "version" : "1.0.0" , ...

    graphql-express-sqlite:具有express,sqlite和async-await的graphql

    graphql-express-sqlite 入门 npm start 例子 查询Bob的所有消息: curl -XPOST -H ' Content-Type:application/graphql ' \ -d ' query RootQueryType { users(name: "Bob"){ messages{text} } } ' \ ...

    express-starter:快速入门

    async / await到处async / await 专为简化测试而设计,重点是“几毫秒之内”的端到端测试 基于服务的文件夹结构( /lib中的每个文件夹都是单独的服务,具有自己的index.js , datastore.js [如果需要]和一个web ...

    express-async-await

    不赞成使用此项目,而希望使用 我们发现, express-async-errors以更好的方式实现了相同的结果。 因此,我们不建议使用该库,建议您改为检查该库!

    NodeJS处理Express中异步错误

    本文主要阐述如何在 Express 中使用错误处理中间件(error-handling middleware)来高效处理异步错误。在 Github 上有对应 代码实例 可供参考。 首先,让我们一起了解 Express 提供的开箱即用的错误处理工具。然

    express-async-handler:Express的异步错误处理中间件

    npm install --save express-async-handler 或者 yarn add express-async-handler 用法: const asyncHandler = require ( 'express-async-handler' ) express . get ( '/' , asyncHandler ( async ( req , res ...

    node中koa中间件机制详解

    koa koa是由express原班人马...koa1基于的co库,所以koa1利用Generator来代替回调,而koa2由于node对async/await的支持,所以koa2利用的是async/await。关于async以及co库等,大家可以参考我之前写过的一篇文章(理解

    ExpressExpress样板,用于构建RESTful API-Node.js开发

    仅启用香草javascript ES2017最新功能(如启用Async / Await CORS)即可使用yarn Express + MongoDB(Mongoose)一致的编码样式以及editorconfig Docker支持使用头盔为安全性加载环境设置一些HTTP标头带有dotenv的....

Global site tag (gtag.js) - Google Analytics