使用 Nextjs 构建中间件

使用 nextjs 构建中间件

在这篇短文中,我将写关于如何使用 nextjs 构建中间件。

我最近使用 nextjs 构建了一个完整的后端服务,我对 nextjs 的进步感到非常震惊。

您需要具备 javascript 和 nodejs 的基本知识才能阅读本文。

要开始,您需要

1.使用以下命令从终端创建一个 nextjs 项目

npx create-next-app@latest

运行此命令后,您将收到一些配置项目的提示,请执行此操作。

创建项目后,

2.通过在终端中运行 npm install 安装必要的依赖项

我们将只安装一个用于身份验证的包库,即 jose,替代方案可能是 jsonwebtoken,但是 nextjs 中间件在浏览器上运行,因此边缘运行时不会实现一堆 node.js api

3.使用下面的命令以开发模式启动您的项目
npm run dev

4.创建一个 middleware.js 文件
在项目的根目录创建一个 middleware.js 文件,如果您使用的是 /src 目录,请在 /src 目录中创建该文件

5。从文件中导出中间件函数

// /middleware.jsexport const middleware = async (req) => {   try {   } catch(error){   console.log(error)   }}

6。从请求标头中提取令牌

// /middleware.jsimport { nextresponse } from 'next/server'export const middleware = async (req) => {   try {    const header = req.headers.get('authorization');        if(!header) return nextresponse.json({             status:'error'             statuscode: 400,             message:'unauthenticated'         })   const token = header.split(" ")[1];        if(!token) return nextresponse.json({             status:'error'             statuscode: 401,             message:'you are not logged in'         })   } catch(error){   console.log(error)   }}

7.使用 jose 验证令牌

// /middleware.jsimport { nextresponse } from 'next/server';import * as jose from 'jose'export const middleware = async (req) => {   try {    const header = req.headers.get('authorization');        if(!header) return nextresponse.json({             status:'error'             statuscode: 400,             message:'unauthenticated'         })   const token = header.split(" ")[1];        if(!token) return nextresponse.json({             status:'error'             statuscode: 401,             message:'you are not logged in'         })    const { payload } = await jose.jwtverify(      token,      new textencoder().encode(process.env.next_public_jwt_key)    );// your encoded data will be inside the payload object.   } catch(error){   console.log(error)   }}

8.从已验证的令牌中提取数据并将其设置在请求标头中

// /middleware.jsimport { nextresponse } from 'next/server';import * as jose from 'jose'export const middleware = async (req) => {   try {    const header = req.headers.get('authorization');        if(!header) return nextresponse.json({             status:'error'             statuscode: 400,             message:'unauthenticated'         })   const token = header.split(" ")[1];        if(!token) return nextresponse.json({             status:'error'             statuscode: 401,             message:'you are not logged in'         })    const { payload } = await jose.jwtverify(      token,      new textencoder().encode(process.env.next_public_jwt_key)    );    const requestheaders = new headers(req.headers)    requestheaders.set('user', payload.id)   } catch(error){   console.log(error)   }}

9.调用 next() 函数并传递更新后的请求头

// /middleware.jsimport { nextresponse } from 'next/server';import * as jose from 'jose'export const middleware = async (req) => {   try {    const header = req.headers.get('authorization');        if(!header) return nextresponse.json({             status:'error'             statuscode: 400,             message:'unauthenticated'         })   const token = header.split(" ")[1];        if(!token) return nextresponse.json({             status:'error'             statuscode: 401,             message:'you are not logged in'         })    const { payload } = await jose.jwtverify(      token,      new textencoder().encode(process.env.next_public_jwt_key)    );    const requestheaders = new headers(req.headers)    requestheaders.set('user', payload.id)    return nextresponse.next({               request: {                headers: requestheaders               }     })   } catch(error){   console.log(error)   }}

10。最后,您需要从中间件文件中导出一个配置对象,其中包含有关您要保护的路由的配置。

// /middleware.jsimport { NextResponse } from 'next/server';import * as jose from 'jose'export const config = {  matcher:[   // contain list of routes you want to protect, e.g /api/users/:path*]}export const middleware = async (req) => {   try {    const header = req.headers.get('authorization');        if(!header) return NextResponse.json({             status:'error'             statusCode: 400,             message:'unauthenticated'         })   const token = header.split(" ")[1];        if(!token) return NextResponse.json({             status:'error'             statusCode: 401,             message:'You are not logged in'         })    const { payload } = await jose.jwtVerify(      token,      new TextEncoder().encode(process.env.NEXT_PUBLIC_JWT_KEY)    );    const requestHeaders = new Headers(req.headers)    requestHeaders.set('user', payload.id)    return NextResponse.next({               request: {                headers: requestHeaders               }     })   } catch(error){   console.log(error)   }}

我希望这 10 个步骤对您有所帮助,请在评论部分告诉我您对此方法的看法,如果有更好的方法来实现这一点,请随时分享。

谢谢你。

以上就是使用 Nextjs 构建中间件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1490311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 13:05:36
下一篇 2025年12月12日 09:48:12

相关推荐

  • 如何在 Nodejs 环境中设置用于生产的全栈项目

    建立生产级全栈 node.js 项目不仅仅涉及编写代码。它需要仔细的规划、强大的架构以及遵守最佳实践。本指南将引导您完成使用 node.js、express 和 react 创建可扩展、可维护且安全的全栈应用程序的过程。 无论您是想要了解生产级设置的初学者,还是旨在完善项目结构的经验丰富的开发人员,…

    2025年12月19日
    000
  • 外包 Nodejs 开发对您的业务的好处

    Node.js 因其速度和效率而成为创建可扩展 Web 应用程序的关键工具之一。如果您正在寻找优化项目的方法,外包 Node.js 开发可能是一个很好的解决方案。聘请经验丰富的外包 Node js 开发公司可以让您将技术方面的工作委托给专业人员,从而专注于战略任务。通过我们的团队,您将获得最佳实践和…

    2025年12月19日
    000
  • JavaScript – 的先锋者们Netscape Nodejs

    ref: http://blog.kueiapp.com/programming-tw/javascript-的先锋者们-netscape-nodejs/ javascript 1.0 javascript 1.0 是由 netscape 公司的 brendan eich 在 1995 年时为著名的…

    2025年12月19日
    000
  • 记录 Nodejs 应用程序的最佳实践

    作为一名 node.js 开发人员,在调试、监控和维护应用程序时,日志记录几乎就是一切。但您是否使用日志记录最佳实践?让我们探索一些可以将您的 node.js 应用程序提升到新水平的日志记录技术。 要了解更多信息,您可以查看完整的博客文章。 1. 温斯顿:伐木界的瑞士军刀 ?工具:温斯顿? 描述:n…

    2025年12月19日
    000
  • Nodejs v env 文件、导入模块和权限模型

    node.js v20.6 已发布,其中包含令人惊叹的新功能,这些新功能是 2023 年 10 月 24 日起 lts 版本的一部分。让我们拭目以待! ini 配置文件 告别 dotenv 包,现在 node.js 可以从 .env 文件加载环境变量。 node –env-file path/to…

    2025年12月19日
    000
  • 为 Reddit API 构建 Nodejs 包装器:分步指南

    为 reddit api 构建 node.js 包装器:分步指南 在现代开发中,api 包装是一项至关重要的技能。封装 api 允许开发人员创建更具可读性、可维护性和可扩展性的代码,最终提高开发效率。今天,我们将探索如何在 node.js 中构建一个简单而有效的包装器来与 reddit 的 api …

    2025年12月19日
    000
  • NodeJS 开发的未来:趋势、挑战和机遇

    简介NodeJS 彻底改变了开发人员进行服务器端编程的方式。作为一个强大的、事件驱动的运行时环境,它使 JavaScript(传统上的客户端语言)成为服务器端的强大玩家。凭借其非阻塞、异步特性,NodeJS 使开发人员能够构建可扩展的高性能应用程序。当我们展望未来时,了解 NodeJS 开发不断发展…

    2025年12月19日
    000
  • 使用 InversifyJS 在 Nodejs 中实现依赖注入

    嘿,开发者社区! 我刚刚在我的博客上发表了一篇关于如何使用 inversifyjs 在 node.js 中实现依赖注入的详细文章。如果您希望使 node.js 应用程序更加模块化、可维护和可测试,那么本指南适合您! 在本文中,我介绍: 什么是依赖注入以及为什么它很重要。如何在 node.js 项目中…

    2025年12月19日
    000
  • 发现 @codedav/datetime-helper – 简化 Nodejs 中的日期和时间管理!

    ? 我们很高兴推出 @codedav/datetime-helper – 一个强大的 Node.js 包,旨在简化日期和时间的格式化!无论您使用 CommonJS 还是 ES 模块,我们的软件包都提供了一系列功能来轻松格式化和操作日期。 ?主要特点: 灵活的日期和时间格式易于使用的日期操作函数兼容 …

    2025年12月19日
    000
  • 使用 Nodejs 和 MongoDB 本机驱动程序构建快速灵活的 CRUD API

    将 node.js 和 express 与 mongodb 本机驱动程序结合使用:原因和方式 如果您使用 node.js 和 express,您可能遇到过 mongoose,这是一个流行的 mongodb odm(对象数据建模)库。虽然 mongoose 提供了许多有用的功能,但您可能有理由选择直接…

    2025年12月19日
    000
  • 免费 Nodejs 托管:快速指南

    需要一个免费平台来托管您的 Node.js 项目? 以下是流行选项的简要概述: 赫罗库: 简单易用,自动缩放。 非常适合小型项目和学习。 有限的资源和睡眠模式。了解更多… 故障: 非常适合协作和快速原型设计。 简单的界面,内置数据库。 不适合复杂的应用程序或长期项目。了解更多&#8230…

    2025年12月19日
    000
  • 如何使用 NVM 安装 Nodejs LTS

    如果您是 javascript 开发人员或刚刚进入 node.js 开发世界,您可能听说过 node.js 的不同版本以及不同项目之间的兼容性问题。 node version manager (nvm) 对于任何需要轻松管理 node.js 多个版本的人来说都是必备工具。 什么是nvm? node …

    2025年12月19日
    000
  • 如何将 PostgreSQL 与 Nodejs 和 Sequelize 连接

    在使用数据库时,开发人员经常面临选择是使用原始数据库查询还是利用抽象出一些复杂性的库。 sequelize 就是这样一个库——一种流行的 node.js orm(对象关系映射器),可与 postgresql、mysql 和其他关系数据库配合使用。在本教程中,我们将深入探讨如何在 node.js 上使…

    2025年12月19日
    000
  • 探索 React JS 从哪里开始?

    几乎到处都听到React,我也忍不住去探索一下!虽然我不需要 React 作为后端工程师,但我觉得它可能是接触前端世界并帮助我了解全局的好方法(确实如此!)。我开始了解前端开发的观点/挑战,并在设计后端系统时牢记它们。更重要的是,了解事物端到端的工作原理是令人满足的。 但是从哪里开始呢? 如果您有 …

    2025年12月19日
    000
  • 缓存

    向您介绍Encache!! 轻量级,易于为您的Nodejs服务器使用Async缓存库。 Encache 是作为 NPM 上可用的所有现有内存中易失性缓存库的下一个迭代而开发的,将其提升到一个全新的水平,同时保持简单性,因为整个缓存只需 4 行代码即可设置。 显着特点 目前Encache支持多种驱逐策…

    2025年12月19日
    000
  • 怎样搭建C++的云函数开发环境 AWS Lambda C++运行时配置

    要在 aws lambda 上用 c++++ 写云函数,第一步是搭建开发环境。1. 安装 c++ 编译器(如 g++ 或 clang++);2. 安装并配置 aws cli;3. 了解 lambda 执行模型;4. 使用 amazon linux 环境或 docker 模拟编译环境以避免依赖问题;5…

    2025年12月18日 好文分享
    000
  • Node.js中的面向对象编程最佳实践

    Node.js 中的面向对象编程最佳实践 类和对象 类定义: class Person { constructor(name, age) { this.name = name; this.age = age; }} 对象创建: const person = new Person(‘John’, 30…

    2025年12月18日
    000
  • 哪个C++框架最适合特定的项目?

    在 c++++ 项目中选择合适框架的指南:确定项目需求(类型、功能、性能、代码重用)评估框架选项(boost、qt、wxwidgets、nan、opencv)选择满足项目需求的框架(根据实际情况,例如跨平台 gui 和图像处理功能) 在 C++ 项目中选择合适框架的指南 选择正确的 C++ 框架对于…

    2025年12月18日
    000
  • Google App Engine 模块化部署:突破单一代码库限制

    本文旨在澄清google app engine go模块是否必须共享同一代码库的常见误解。我们将深入探讨app engine模块化架构,阐明每个模块不仅可以拥有独立的运行时环境,还能维护各自的代码库。这极大地提升了应用设计的灵活性,允许开发者在同一应用中融合多种语言和技术栈,从而充分利用各语言的优势…

    2025年12月16日
    000
  • App Engine 模块:独立代码库与多运行时配置详解

    app engine 模块允许开发者为同一应用部署独立的 go 代码库,并支持配置不同的运行时环境。这一范式打破了传统上认为所有模块必须共享同一代码库的限制,极大地增强了应用的灵活性和可扩展性。通过为每个模块指定独立的配置文件和根目录,开发者可以构建微服务架构,充分利用不同语言的优势,从而优化应用性…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信