【问题标题】:Where should I store JSON file and fetch data in Next.JS whenever I need?我应该在哪里存储 JSON 文件并在需要时在 Next.JS 中获取数据?
【发布时间】:2021-11-07 12:40:07
【问题描述】:

项目:

我正在开发一个电子商务应用程序,它有超过 1,600 种产品156 个类别 .

问题:

最初,在第一个产品页面上,将提取 30 个产品(由于页面限制),但在左侧边栏上,我需要根据 标签 决定的过滤器所有 1,600 种产品。所以这就是为什么我需要在第一次获取所有产品,然后我将通过循环所有产品来提取常见的标签,并立即将它们显示在侧边栏上。

我想要什么?

我不确定,但我认为如果我生成一个包含所有产品的 JSON 文件 并将其存储在某个地方,我可以使用 REST API 获取只需点击 URL Next JS(在 getServerSideProps 或 getStaticProps 中)。

警告:

我尝试将 JSON 文件存储在下一个 js 应用程序的 ./public 目录中,它在 localhost 中有效,但在 vercel 中无效。

这是我为在 ./public 目录中存储 JSON 文件而编写的代码:

fs.writeFileSync("./public/products.json", JSON.stringify(products, null, 2));  //all 1,600 products

【问题讨论】:

  • 我看到了一个 redis 标签,但是你说你要获取的 30 个产品实际上是按堆栈存储的?
  • 那你为什么不直接fetchpublic 目录中的文件呢?
  • @Nelloverflow 我从每页只提供 30 个产品的后端获取,但是为了获取所有产品,我必须为每个页面使用循环,每个页面包含 30 个产品,因此对于 1600 多个产品我认为我必须使用超过 300 次。示例:&per_page=30&page1
  • @IvanV。在 vercel 无服务器函数中出现错误,并且不推荐从本地文件中获取数据的方法错误:错误:ENOENT:没有这样的文件或目录,打开 './public/products.json'
  • 我添加了一个 Redis 标签,因为我对 redis 的唯一了解是,它有助于缓存数据....所以这就是为什么我认为 Redis 可能会为我的问题提供解决方案

标签: next.js vercel


【解决方案1】:

一种解决方案是直接从前端获取它(如果文件不是太大),否则,要读取getServerSideProps 中的文件,您将需要自定义 webpack 配置。

//next.config.js
const path = require("path")
const CopyPlugin = require("copy-webpack-plugin")

module.exports = {
    target: "serverless",
    future: {
        webpack5: true,
    },
    webpack: function (config, { dev, isServer }) {
        // Fixes npm packages that depend on `fs` module
        if (!isServer) {
            config.resolve.fallback.fs = false
        }
        // copy files you're interested in
        if (!dev) {
            config.plugins.push(
                new CopyPlugin({
                    patterns: [{ from: "content", to: "content" }],
                })
            )
        }

        return config
    },
}

然后你可以创建一个实用函数来获取文件:

export async function getStaticFile(file) {
    let basePath = process.cwd()
    if (process.env.NODE_ENV === "production") {
        basePath = path.join(process.cwd(), ".next/server/chunks")
    }

    const filePath = path.join(basePath, `file`)
    const fileContent = await fs.readFile(filePath, "utf8")
    return fileContent
}

关于此有一个未解决的问题: Next.js API routes (and pages) should support reading files

【讨论】:

  • 是否有任何其他资源可以存储该文件而不是本地文件??
  • 如果可能的话,我想存储在任何外部数据库中,如果可能的话,你会建议哪一个?
  • 使用 MongoDB,这是最容易使用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2017-10-11
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多