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

Node.js中JSON对象字段无法移除及PDF生成路由技术咨询

Let's break down your two Node.js issues and fix them step by step:

1. Removing a specific field from a JSON object in Node.js

First, a quick clarification: when you mention a "JSON object", you're likely working with a plain JavaScript object (JSON itself is just a string format). Here are two solid approaches to remove unwanted fields:

Option 1: Use the delete operator (modifies original object)

If you don't need to keep the original object intact, this is the simplest method:

const feature = { _id: '5ad5ddddcd054b2b5b20143c', name: 'Project sidebar', description: '...' };
delete feature._id; // Removes the _id field from the object
console.log(feature); // Output: { name: 'Project sidebar', description: '...' }

Note: This works for most standard objects, but won't work if the property is marked as non-configurable (uncommon in typical app scenarios).

Option 2: Destructuring assignment (immutable, no original object changes)

If you want to preserve the original object, use destructuring to create a new object without the unwanted field:

const feature = { _id: '5ad5ddddcd054b2b5b20143c', name: 'Project sidebar', description: '...' };
const { _id, ...cleanFeature } = feature; // Extracts _id, rest goes to cleanFeature
console.log(cleanFeature); // Output: { name: 'Project sidebar', description: '...' }

Handling arrays of objects (like your features database result)

To remove a field from every object in an array, loop through the array with either approach:

// Immutable approach (returns new array, original stays untouched)
const cleanFeatures = features.map(({ _id, ...feature }) => feature);

// Mutable approach (modifies original array)
features.forEach(feature => delete feature._id);

2. Fixing PDF output showing raw JSON instead of formatted content

The problem here is that features.toString() converts your Mongoose document array into a raw string representation of the objects—hence the JSON-like output in your PDF. Most PDF generation libraries (like html-pdf) expect HTML content to render a properly formatted document. Here's how to fix your route:

Step 1: Create a helper function to generate formatted HTML

We'll convert your features into an HTML table for readability (you can adjust this to lists, cards, etc., based on your needs):

function generateFeaturesHtml(features) {
  // Start with a basic HTML template with styling
  let html = `
    <!DOCTYPE html>
    <html>
      <head>
        <style>
          body { font-family: Arial, sans-serif; margin: 20px; }
          h1 { color: #333; }
          table { width: 100%; border-collapse: collapse; margin-top: 20px; }
          th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
          th { background-color: #f5f5f5; }
        </style>
      </head>
      <body>
        <h1>Features Report</h1>
        <table>
          <tr>
            <th>Feature Name</th>
            <th>Description</th>
          </tr>
  `;

  // Add each feature as a table row
  features.forEach(feature => {
    // Decode HTML entities (like &lt;p&gt; to <p>) so content displays correctly
    const decodedDescription = feature.description.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
    html += `
      <tr>
        <td>${feature.name}</td>
        <td>${decodedDescription}</td>
      </tr>
    `;
  });

  // Close the HTML structure
  html += `
        </table>
      </body>
    </html>
  `;
  return html;
}

Step 2: Update your route to use the HTML generator

Replace your existing route code with this revised version:

featureRoutes.route('/report/').get(function (req, res) {
  Feature.find(function (err, features) {
    if (err) {
      console.error(err);
      return res.status(500).send('Failed to fetch features');
    }

    // Convert features array to formatted HTML
    const pdfContent = generateFeaturesHtml(features);

    pdf.create(pdfContent).toStream(function (err, stream) {
      if (err) {
        console.error(err);
        return res.status(500).send('Failed to generate PDF');
      }
      res.type('application/pdf');
      stream.pipe(res);
    });
  });
});

Key improvements explained:

  • Replaced features.toString() with valid HTML that the PDF library can render into a clean, readable document.
  • Added decoding for HTML entities in the description field so formatted content (like paragraphs) displays correctly.
  • Included basic CSS styling to make the PDF look professional.
  • Added proper error handling for both database fetching and PDF generation.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:42:39