You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中使用fs模块无报错却无法写入文件的问题求助

Next.js API路由中使用fs写入JSON文件无反应的解决方案

核心问题分析

  • 相对路径不可靠:Next.js API路由运行时的工作目录为项目根目录,但你的apiActions.js位于src/helpers下,使用../database.json会导致路径指向错误,相对路径易受文件结构变化影响,无法稳定定位目标文件。
  • JSON结构写入错误:你的database.json是包含data字段的对象,但写入时仅输出过滤后的数组,破坏了原文件结构,导致后续读取异常,也会让你误以为写入未生效。
  • 静态导入缓存问题:API路由中import apartmentList from '@/database.json'属于静态导入,Next.js会在构建时缓存文件内容,无法获取实时的文件更新。

修复步骤

1. 使用绝对路径定位JSON文件

在apiActions.js中通过process.cwd()获取项目根目录,拼接出database.json的绝对路径,彻底避免相对路径的问题:

var fs = require('fs')
var path = require('path')

// 拼接database.json的绝对路径(根据实际文件位置调整,示例为项目根目录下)
const dbPath = path.join(process.cwd(), 'database.json')

export const actions = {
    delete: _delete
}

function _delete(id) { 
    // 动态读取文件,避开Node.js的require缓存
    const apartmentList = JSON.parse(fs.readFileSync(dbPath, 'utf8'))
    const newDataSet = apartmentList.data.filter((item) => item.id !== id)
    
    try {
        // 保持原文件的结构,写入包含data字段的对象
        fs.writeFileSync(dbPath, JSON.stringify({ data: newDataSet }, null, 4), 'utf8')
        return true
    } catch(err) {
        console.error('写入文件失败:', err)
        return false
    }
}

2. 修正API路由的文件读取逻辑

API路由中放弃静态导入,改为动态读取文件,确保每次请求都获取最新的文件内容:

import type { NextApiHandler } from 'next'
import { actions } from '@/helpers/apiAction.js'
import fs from 'fs'
import path from 'path'

const DeleteApartmentsHandler: NextApiHandler = async (request, response) => {
    const { deleteId } = request.query
    const dbPath = path.join(process.cwd(), 'database.json')
    const apartmentList = JSON.parse(fs.readFileSync(dbPath, 'utf8'))
    
    const newDataSet = apartmentList.data.filter((item) => item.id !== Number(deleteId))

    if (newDataSet.length === apartmentList.data.length - 1) {
        const makeDelete = actions.delete(Number(deleteId))
        
        if (makeDelete) {
            response.status(200).json(`l'appartement ${deleteId} a bien été supprimé`)
        } else {
            response.status(501).json("Nous avons rencontré un soucis durant la suppression")
        }
    } else {
        response.status(500).json("il semblerait qu'aucun element n'ait été supprimé")
    }
}

export default DeleteApartmentsHandler

3. 验证基础配置

  • 确认database.json的实际位置:如果文件在src目录下,将dbPath修改为path.join(process.cwd(), 'src', 'database.json')。
  • 检查文件权限:在Linux/macOS环境下,可执行chmod 644 database.json确保文件具备读写权限。

额外说明

  • fs.writeFileSync本身返回undefined是正常行为,它仅在写入失败时抛出异常,你的错误捕获逻辑是正确的,之前的问题根源是路径错误导致异常被触发,返回false。
  • 开发环境中Next.js API路由会热重载,但动态读取文件能保证每次请求获取最新的文件状态。

内容的提问来源于stack exchange,提问作者robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:32:09