在我的Next.js14应用程序中,我有一个/research/page.tsx文件,其中我接收一个文件作为用户输入,并将其发送到服务器端API进行进一步处理.下面是实现这一点的方法:

const handleFileDrop = async (file: File) => {
    // Convert file to blob
    const arrayBuffer = await file.arrayBuffer()
    const blob = new Blob([arrayBuffer])
    const paperId = await generateFileId(arrayBuffer)
    const paperTitle = file.name

    // Send file to api/upload for upload to S3
    try {
      const res = await fetch("/api/upload", {
        method: "POST",
        body: file,
      })
      if (!res.ok) throw new Error(await res.text())
      console.log(await res.json())
    } catch (error: any) {
      // handle error
    }
  }

在服务器上,/api/upload/route.ts处的API旨在对文件执行一系列操作,并在完成后将用户重定向到新的动态生成的路由:

/* eslint-disable import/prefer-default-export, @typescript-eslint/no-unused-vars */

import { NextRequest, NextResponse } from "next/server"
import generateFileId from "@/lib/generate-file-id"
import { PDFLoader } from "langchain/document_loaders/fs/pdf"
// import AWS from "aws-sdk"

// const s3 = new AWS.S3()

async function streamToArrayBuffer(stream: ReadableStream) {
  return new Uint8Array(await new Response(stream).arrayBuffer())
}

export async function POST(request: NextRequest) {
  const data = await request.body
  if (!data) return NextResponse.json({ success: false })
  const arrayBuffer = await streamToArrayBuffer(data)
  const blob = new Blob([arrayBuffer])
  const loader = new PDFLoader(blob)
  const pageLevelDocs = await loader.load()
  const pageCount = pageLevelDocs.length
  const paperId = await generateFileId(arrayBuffer)

  /*
  STEP 1: Upload file to S3
  STEP 2: Add reference to file in Postgres
  */
  console.log("test")
  return NextResponse.redirect(new URL(`/research/${paperId}`, request.url))
}

console.log("test")的声明中,一切都很正常.但重定向不会奏效.浏览器保持在/research,而不是重定向到/research/[paperId].

我甚至try 在API成功响应时从客户端重定向,使用useRouterrouter.push(),但即使这样也不起作用:

const handleFileDrop = async (file: File) => {
    // Convert file to blob
    const arrayBuffer = await file.arrayBuffer()
    const blob = new Blob([arrayBuffer])
    const paperId = await generateFileId(arrayBuffer)
    const paperTitle = file.name

    // Send file to api/upload for upload to S3
    try {
      const res = await fetch("/api/upload", {
        method: "POST",
        body: file,
      })
      if (!res.ok) throw new Error(await res.text())
      console.log(await res.json())
      const router = useRouter()
      router.push("/research/${paperId}")
    } catch (error: any) {
      // handle error
    }
  }

浏览器将保留原始URL.

我有两个问题:

我的代码中缺少什么,以及 应对这种情况的传统方法是什么?我需要新的页面能够访问file对象也.

推荐答案

您不能像您那样重定向通过JavaScript发出的网络呼叫.相反,您应该返回一个正常的响应:

import { NextResponse } from "next/server";

export async function POST(request: NextRequest) {
  const data = await request.body;
  if (!data) return NextResponse.json({ success: false });
  const arrayBuffer = await streamToArrayBuffer(data);
  const blob = new Blob([arrayBuffer]);
  const loader = new PDFLoader(blob);
  const pageLevelDocs = await loader.load();
  const pageCount = pageLevelDocs.length;
  const paperId = await generateFileId(arrayBuffer);

  /*
  STEP 1: Upload file to S3
  STEP 2: Add reference to file in Postgres
  */
  console.log("test");
  return NextResponse.json({
    success: true,
    paperId: paperId,
  });
}

并在客户端处理重定向:

// In the component body:
const router = useRouter();

const handleFileDrop = async (file: File) => {
  // Convert file to blob
  const arrayBuffer = await file.arrayBuffer();
  const blob = new Blob([arrayBuffer]);
  const paperId = await generateFileId(arrayBuffer);
  const paperTitle = file.name;

  // Send file to api/upload for upload to S3
  try {
    const res = await fetch("/api/upload", {
      method: "POST",
      body: file,
    });
    if (!res.ok) throw new Error(await res.text());
    const { paperId } = await res.json();

    router.push(`/research/${paperId}`);
  } catch (error: any) {
    // handle error
  }
};

在这一点上,如果你有一个research/[paperId]/page.tsx,你是好的go .

Javascript相关问答推荐

使用print This时, map 容器已在LeafletJS中初始化

我在这个黑暗模式按钮上做错了什么?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

D3 Scale在v6中工作,但在v7中不工作

将自定义排序应用于角形数字数组

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

Chromium会将URL与JS一起传递到V8吗?

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

如何使用子字符串在数组中搜索重复项

更新动态数据中对象或数组中的所有值字符串

如何在Svelte中从一个codec函数中调用error()?

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

使用Document.Evaluate() Select 一个包含撇号的HTML元素

删除元素属性或样式属性的首选方法

Phaser3 preFX addGlow不支持zoom

与在编剧中具有动态价值的定位器交互

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

Chart.js Hover线条在鼠标离开时不会消失

扩散运算符未按预期工作,引发语法错误

如何使用fltter_js将对象作为参数传递给javascrip?