由于 Next 14 服务器缓存行为,SSG 可能存在错误

问题描述 投票:0回答:1

我正在编写一个需要国际化的厨师网页,因此我使用 SSG 预渲染每个区域设置的所有页面。 我在尝试构建从后端获取数据的服务器或页面组件时发现构建时存在问题,只有在缓存来自后端的数据、选择退出缓存或不使用 SSG 或只是运行时,才会出现此问题开发模式没有问题,但是缓存行为阻止了数据库请求,并且总是给我一个 MongoNotConnectedError: Client must be connect before running actions... 我已经检查过了,这不是数据库问题,因为正如我所说,如果我选择退出缓存,则根本没有问题,并且所有内容都按预期运行。问题是,从服务器获取的每个数据都将被动态渲染,而缓存则毫无用处。任何人都知道发生了什么?:lolsob:

这是应用程序目录中菜单页面的代码,SSG 语言环境正在主布局级别设置。

import { getAllProducts } from '@/database/dbProducts';
import XDraggableList from '../XDraggableList';
import MenuItem from './MenuItem';
import { IMenuItem } from '@/interfaces/IMenuItem';

const Menu = async () => {
  
const products: IMenuItem[] = await getAllProducts();

  .... rest of the code
  );
};

export default Menu;

这是从数据库获取数据的代码:

import { db } from '.';
import { IMenuItem } from '@/interfaces/IMenuItem';
import Product from '@/models/Product';
import { unstable_noStore } from 'next/cache';

export const getAllProducts = async (): Promise<IMenuItem[]> => {
  //TODO: why is the error at build time when caching is not opt out
  //unstable_noStore();
  //if the unstable_noStore() option is not used I get the build time error
  //MongoNotConnectedError: Client must be connected before running operations
  //the problem with having to opt-out the caching behaviour is that then the request
  //is always reaching the database

  await db.connect();
  const products = await Product.find().sort({ name: 1 }).lean();
  await db.disconnect();

  return JSON.parse(JSON.stringify(products));
};

这是我收到的错误:

$ yarn build
yarn run v1.22.19
$ next build
   ▲ Next.js 14.0.3
   - Environments: .env

 ✓ Creating an optimized production build
 ✓ Compiled successfully
 ✓ Linting and checking validity of types    
 ✓ Collecting page data    
   Generating static pages (24/32) [  ==]
Connected to MongoDb:
MongoNotConnectedError: Client must be connected before running operations
    at executeOperationAsync (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:23:19)
    at C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:45
    at maybeCallback (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\utils.js:269:21)
    at executeOperation (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:38)
    at FindCursor._initialize (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\find_cursor.js:55:73)
    at [kInit] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:450:38)
    at next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:510:32)
    at FindCursor.next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:226:16)
    at [Symbol.asyncIterator] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:160:45)
    at AsyncGenerator.next (<anonymous>) {
  [Symbol(errorLabels)]: Set(0) {}
}

此错误重复 7 次,然后又出现另一个错误:

Generating static pages (24/32) [   =]
Connected to MongoDb:
   Generating static pages (24/32) [  ==]
Connected to MongoDb:
   Generating static pages (24/32) [ ===]
Connected to MongoDb:
Connected to MongoDb:
Disconnnected from MongoDb

Error occurred prerendering page "/de/menu". Read more: https://nextjs.org/docs/messages/prerender-error
MongoNotConnectedError: Client must be connected before running operations
    at executeOperationAsync (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:23:19)
    at C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:45
    at maybeCallback (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\utils.js:269:21)
    at executeOperation (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:38)
    at FindCursor._initialize (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\find_cursor.js:55:73)
    at [kInit] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:450:38)
    at next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:510:32)
    at FindCursor.next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:226:16)
    at [Symbol.asyncIterator] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:160:45)
    at AsyncGenerator.next (<anonymous>)
Disconnnected from MongoDb
Disconnnected from MongoDb

Error occurred prerendering page "/es/menu". Read more: https://nextjs.org/docs/messages/prerender-error
MongoNotConnectedError: Client must be connected before running operations
    at executeOperationAsync (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:23:19)
    at C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:45
    at maybeCallback (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\utils.js:269:21)
    at executeOperation (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\operations\execute_operation.js:12:38)
    at FindCursor._initialize (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\find_cursor.js:55:73)
    at [kInit] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:450:38)
    at next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:510:32)
    at FindCursor.next (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:226:16)
    at [Symbol.asyncIterator] (C:\Users\pcjos\Desktop\Proyectos\Ingrid\shadcn-ingrid-webpage\node_modules\mongodb\lib\cursor\abstract_cursor.js:160:45)
    at AsyncGenerator.next (<anonymous>)

其他语言环境依此类推... 有谁知道发生了什么吗?

我尝试选择退出数据获取缓存,它正在工作,问题是它使 SSG 毫无用处,因为我总是使用数据库中的新数据重新生成页面。

caching next.js app-router static-site-generation react-server-components
1个回答
0
投票
export const dynamic = "force-dynamic";
© www.soinside.com 2019 - 2024. All rights reserved.