如何在 NextJS 13 中使用 API 路由
P粉903969231
P粉903969231 2023-09-07 10:55:40
0
1
656

使用 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粉903969231
P粉903969231

全部回覆(1)
P粉176980522

在 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
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板