0

0

Nuxt 中的请求上下文

聖光之護

聖光之護

发布时间:2024-10-26 15:27:12

|

1256人浏览过

|

来源于dev.to

转载

nuxt 中的请求上下文

介绍

nuxt 最近引入了一项实验性功能:使用 nodejs asynclocalstorage 的异步上下文支持。
此增强功能有望简化开发人员跨嵌套异步函数管理上下文的方式,但还有更多!

需要注意的是,“实验性”标签是由于跨平台支持有限;但是,在使用 nodejs 时它很稳定,使其成为在该环境中工作的开发人员的可靠选择。

https://nuxt.com/docs/guide/going-further/experimental-features#asynccontext

nodejs 中的 asynclocalstorage 允许您跨异步操作一致地存储和访问数据。它维护上下文,使管理用户会话或请求特定信息等数据变得更加容易。

asynccontext 解决什么问题?

  • 跨异步操作的上下文一致性asynccontext确保上下文数据在所有异步调用中保持可访问,而无需手动将其传递到函数层。

  • 减少样板代码:通过消除重复的上下文传递逻辑来简化代码库。

维护一致的请求上下文一直是 nodejs 应用程序中的一个挑战,甚至在 nuxt 之前也是如此。

有问题的

一个用例是实施日志系统来跟踪客户通过我们网站的路径。为了实现这一目标,我们需要在每个日志条目中包含一个相关 id,以确保我们能够一致地跟踪每个客户的旅程。

这个问题是,当您有更多具有多层的应用程序逻辑时,您必须将上下文传递到这些层。

让我们看一个例子:

nuxt-demo-async-context/
├── public/
│   └── favicon.ico
├── server/
│   ├── api/
│   │   ├── index.ts
│   │   └── users.ts
│   ├── middleware/
│   │   └── correlationid.middleware.ts
│   ├── repository/
│   │   └── user.repository.ts
│   ├── service/
│   │   └── user.service.ts
│   └── utils/
│       └── logger.ts
├── .gitignore
├── readme.md
├── app.vue
├── nuxt.config.ts
├── package-lock.json
├── package.json
├── tsconfig.json
└── yarn.lock

文件结构和代码草稿

1. [id].ts

export default defineeventhandler((event) => {
  const id = event.context.params.id;
  const { correlationid } = event.context;
  try {
    const user = userservice.getuserbyid(id, correlationid);
    return {
      user,
      message: `user with id ${id} retrieved successfully`
    };
  } catch (error) {
    return {
      statuscode: 404,
      message: `user with id ${id} not found`
    };
  }
});

1. userrepository.ts

// this would typically interact with a database
const users = new map<string, { id: string; name: string; email: string }>();

export default {
  findbyid(id: string) {
    return users.get(id) || null;
  },

  save(user: { id: string; name: string; email: string }) {
    users.set(user.id, user);
    return user;
  }
};

正如您所见,问题在于我们在每个层上传递了作为请求上下文的correlationid 变量,这意味着每个函数都对correlationid 变量有依赖性。

现在想象一下我们是否必须对每个应用程序逻辑执行此操作。

请不要在全局变量中设置此类逻辑,nodejs 将在每个用户的每个请求之间共享此上下文。

解决方案

asynccontext可以解决这个问题!

Calliper 文档对比神器
Calliper 文档对比神器

文档内容对比神器

下载

一旦您激活 nuxt 中的实验性功能 asynccontext。

您现在可以从任何地方访问该活动。

我们可以创建一个中间件,将该correlationid 传递给事件,以便在应用程序中的任何位置可用:

服务器/中间件/correlationid.ts

import { randomuuid } from 'crypto';
import { setcookie, getcookie } from "#imports";

export default defineeventhandler((event) => {
  // add a random correlationid to the event context
  const correlationid = getcookie(event, "correlationid") || randomuuid();
  event.context.correlationid = correlationid;

  setcookie(event, "correlationid", correlationid);
});

现在我们可以做类似的事情:

export default {
  info(message: string) {
    const { context: { correlationId } } = useEvent();
    console.log(JSON.stringify({ level: 'INFO', message, correlationId }));
  },
  error(message: string) {
    const { context: { correlationId } } = useEvent();
    console.error(JSON.stringify({ level: 'ERROR', message, correlationId }));
  }
};

不再需要将请求或参数传递给我们的记录器。

我们可以应用此技术来获取用户上下文,这是一个常见的用例。

结论

asynccontext 简化了 nuxt 应用程序中的上下文管理,减少了样板代码并确保异步操作之间的一致性。

我们可以进一步通过为请求上下文或用户服务等服务实现依赖注入。

这种方法减少了耦合并最大限度地减少了层之间的依赖关系,使代码库更加模块化、更易于维护和可测试。

进一步阅读

poc 可在此处 https://github.com/marc-arnoult/nuxt-demo-as​​ync-context

有关如何实现 asynccontext 以及探索 nuxt 中其他实验性功能的更多详细信息,请查看官方文档。
https://nodejs.org/api/async_context.html

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

184

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

3

2026.03.17

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4618

2026.01.21

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2999

2024.08.16

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

109

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

13

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.8万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号