使用 Express 時,我曾經儲存像 request.user
這樣的使用者:
import jwt from "jsonwebtoken"; import asyncHandler from "express-async-handler"; import User from "../models/userModel.js"; const protect = asyncHandler(async (req, res, next) => { let token; token = req.cookies.jwt; if (token) { try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = await User.findById(decoded.userId).select("-password"); next(); } catch (error) { res.status(401); throw new Error("Not authorized , invalid token"); } } else { res.status(401); throw new Error("Not authorized , no token"); } }); export { protect }; And I was able to get the current user like this : const createPost = asyncHandler(async (req, res) => { const { content, image } = req.body; const user = req.user;
但是如何使用 NextJS 13 API 路由和中間件以及如何使用 cookie 來做到這一點。 NextJS 的新手,因此我們將不勝感激。
P粉1769805222023-09-08 00:18:14
在 Next.js 中,您可以使用 NextRequest 和 NextResponse 上的 cookie 擴充功能來讀取和操作 cookie。具體方法如下:
首先,您需要從 next/headers 匯入 cookie:
import { cookies } from 'next/headers'
然後,你可以得到這樣的cookie:
const cookieStore = cookies() const token = cookieStore.get('token')
要設定 cookie,您需要使用 Set-Cookie 標頭傳回新的回應:
return new Response('Hello, Next.js!', { status: 200, headers: { 'Set-Cookie': `token=${token}` }, })
您也可以使用 NextRequest 物件來讀取 cookie:
export async function GET(request) { const token = request.cookies.get('token') }
對於傳入的請求,cookie 有以下方法:get、getAll、set 和 delete cookies。您可以使用 has 檢查 cookie 是否存在,或使用clear 刪除所有 cookie。
對於傳出回應,cookie 具有以下方法 get、getAll、set 和 delete。
以下是如何使用這些方法的範例:
import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export function middleware(request: NextRequest) { let cookie = request.cookies.get('nextjs') console.log(cookie) // => { name: 'nextjs', value: 'fast', Path: '/' } const allCookies = request.cookies.getAll() console.log(allCookies) // => [{ name: 'nextjs', value: 'fast' }] request.cookies.has('nextjs') // => true request.cookies.delete('nextjs') request.cookies.has('nextjs') // => false const response = NextResponse.next() response.cookies.set('vercel', 'fast') response.cookies.set({ name: 'vercel', value: 'fast', path: '/', }) cookie = response.cookies.get('vercel') console.log(cookie) // => { name: 'vercel', value: 'fast', Path: '/' } return response }