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

如何用Node.js和文件系统从JSON文件提取指定数据?

解决方案

前提假设

假设你的posts.json结构如下(包含多个帖子对象的数组):

[
  {
    "id": 1,
    "title": "First Post",
    "body": "This is the first post content",
    "extraField": "ignore this"
  },
  {
    "id": 2,
    "title": "Second Post",
    "body": "This is the second post content",
    "extraField": "ignore this too"
  }
]

完整实现代码

const express = require('express');
const fs = require('fs').promises;
const path = require('path');
const app = express();
const PORT = 3000;

// 工具函数:统一读取并提取帖子的指定字段
async function getFilteredPosts() {
  try {
    // 拼接posts.json的绝对路径
    const filePath = path.join(__dirname, 'posts.json');
    const rawData = await fs.readFile(filePath, 'utf8');
    const posts = JSON.parse(rawData);
    
    // 只提取id、title、body三个字段
    return posts.map(post => ({
      id: post.id,
      title: post.title,
      body: post.body
    }));
  } catch (err) {
    console.error('读取帖子文件失败:', err);
    throw err;
  }
}

// 修改/api/posts接口:返回第一个帖子的指定字段
app.get('/api/posts', async (req, res) => {
  try {
    const posts = await getFilteredPosts();
    if (posts.length === 0) {
      return res.status(404).json({ message: '暂无帖子数据' });
    }
    // 返回数组第一个元素
    res.json(posts[0]);
  } catch (err) {
    res.status(500).json({ message: '获取帖子数据失败' });
  }
});

// 实现/api/posts/:id接口:根据ID返回对应帖子
app.get('/api/posts/:id', async (req, res) => {
  try {
    // 把URL参数的ID转为数字(如果你的帖子ID是字符串类型,可省略此步骤)
    const targetId = parseInt(req.params.id);
    if (isNaN(targetId)) {
      return res.status(400).json({ message: '无效的帖子ID' });
    }

    const posts = await getFilteredPosts();
    // 查找匹配ID的帖子
    const matchedPost = posts.find(post => post.id === targetId);

    if (!matchedPost) {
      return res.status(404).json({ message: '未找到对应帖子' });
    }

    res.json(matchedPost);
  } catch (err) {
    res.status(500).json({ message: '获取指定帖子失败' });
  }
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});

关键注意事项

  1. 异步读取文件:使用fs.promises.readFile而非同步读取,避免阻塞Express的事件循环。
  2. 字段提取复用:通过工具函数getFilteredPosts统一处理字段提取,减少重复代码,后续修改字段只需改这一处。
  3. 边界情况处理:覆盖了帖子为空、ID参数无效、找不到对应帖子等场景,返回符合HTTP规范的状态码和提示信息。
  4. 类型匹配:确保URL参数的ID类型和posts.json里的ID类型一致(如果你的ID是字符串,删除parseInt转换步骤即可)。

内容的提问来源于stack exchange,提问作者Ričards Bainors

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:35:43