跳過到頁腳內容
NODE 說明

hapi node js(開發者的使用方法)

在目前的 Web 開發環境中,產生動態 PDF 文件是許多應用程式的典型需求。 在伺服器端產生和處理 PDF 文件的能力對於產生報告、發票和使用者指南至關重要。 本文將討論如何將穩定的PDF創建包 IronPDF 與強大的 Node.js 框架Hapi.js整合。 我們也將研究可行的方法,以確保Node.js、Hapi伺服器和.NET之間能夠順利連接,因為IronPDF是一個.NET函式庫。

了解 Hapi.js

一個名為 Hapi 伺服器外掛程式的開源框架可用於建立可擴充且可靠的 Node.js 線上應用程式、核心 API 和服務。 Hapi.js 由 Walmart Labs 開發,以其強大的插件系統、充滿活力的框架和可擴展插件生態系統以及眾多可配置選項而聞名。 它是創建現代 Web 應用程式的絕佳選擇,因為它簡化了伺服器設定、請求處理、資料庫使用和路由。

! hapi node js(開發者使用指南):圖 1 - Hapi.js

插件系統和豐富的生態系統

Hapi.js 擁有強大的插件社區,擴展了其基本功能。 由於其模組化設計,當 Hapi 開發人員添加輸入驗證、身份驗證和快取等功能的業務邏輯時,基本框架不會變得臃腫。 插件系統鼓勵編寫易於管理和可重複使用的程式。

路由

Hapi.js 提供了一個強大且適應性強的路由系統。 它提供特定於路由的配置選項,例如驗證、身份驗證和回應格式,並支援多種 HTTP 協定。 憑藉這種多功能性,可以輕鬆創建複雜的路由邏輯。

基於配置的方法論

Hapi.js 採用配置驅動的方法,使開發人員能夠透過配置物件指定伺服器行為。 由於伺服器行為的改變通常無需更改應用程式或業務邏輯程式碼即可實現,因此程式碼量更少、程式碼更簡潔、程式碼庫更易於維護。

輸入驗證和有效載荷解析

Joi 是一種高效的資料庫模式描述語言和資料驗證器,可輕鬆與 Hapi.js 互動。 透過此集成,可以實現強大的輸入驗證,確保請求資料在處理之前符合預定標準。 Hapi.js 也支援解析各種資料類型的有效載荷,例如 JSON 和表單資料。

內建身份驗證和授權

借助 hapi-auth 插件,Hapi.js 為可擴展的 Web 應用程式提供了完整的身份驗證和授權機制。 此整合授權系統支援多種身份驗證技術,例如基本身份驗證、JWT 身份驗證、OAuth 身份驗證和自訂方案。 透過在路由層級管理授權,可以確保安全的資源存取和開銷最小的安全框架。 Hapi.js 的設計初衷就是為了在複雜的企業環境中運作。 Hapi 允許我們建立各種應用程序,例如網站、伺服器、HTTP 代理應用程式等。

錯誤處理

Hapi.js 提供豐富的錯誤處理功能。 開發人員可以定義自訂錯誤處理程序,以處理全域問題或單一專案的路由層級問題。 這樣可以確保問題得到一致的處理,並且客戶能夠獲得有見地的錯誤解答。

日誌記錄和調試

Hapi 生態系統包含強大的日誌記錄和偵錯功能,有助於修復錯誤。 它可以設定為記錄和日誌記錄多種類型的事件,例如伺服器活動、故障和請求生命週期事件。 此日誌記錄功能對應用程式的故障排除和效能監控非常有幫助。

延伸性

Hapi.js 的設計具有極強的可擴充性,例如,開發人員可以建立自訂外掛程式來更改或添加現有行為。 由於其可擴展性,Hapi.js 可以根據任何專案的獨特需求進行客製化。

安全

Hapi.js 透過提供對廣泛使用的安全程序、可擴展應用程式和框架(包括輸入驗證、內容安全策略和 HTTP 標頭配置)的整合支持,將安全性放在首位。 開發者可以透過高度重視安全性來創建能夠抵禦常見漏洞的應用程式和框架。

建立和配置 Hapi Node.js

建立和設定 Hapi.js 伺服器需要多個步驟。 這裡提供一份全面的指南,幫助您安裝外掛程式、建立路由並設定基本的 Hapi.js 伺服器。 我們將引導您完成建立路由、設定伺服器、設定初始設定和使用插件的過程。

安裝 Hapi.js

安裝 Hapi.js 及其他必要的相依性:

npm install @hapi/hapi
npm install @hapi/hapi
SHELL

創建伺服器

要建立一個基本的 Hapi.js 伺服器,請建立一個名為server.js文件,並將下列程式碼新增至該檔案:

const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a simple GET route
    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello world!';
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a simple GET route
    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello world!';
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
JAVASCRIPT

新增路由配置

Hapi.js 路由的更進階設定選項包括參數、查詢參數、有效負載驗證、快取以及為實現特定路由而客製的插件。

帶參數的路由

const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a GET route with path parameter
    server.route({
        method: 'GET',
        path: '/user/{id}',
        handler: (request, h) => {
            const userId = request.params.id;
            return `User ID: ${userId}`;
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a GET route with path parameter
    server.route({
        method: 'GET',
        path: '/user/{id}',
        handler: (request, h) => {
            const userId = request.params.id;
            return `User ID: ${userId}`;
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
JAVASCRIPT

帶有查詢參數的路由

此外,使用 Hapi.js 可以輕鬆處理查詢參數。 以下是如何做到這一點:

const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a GET route with query parameter
    server.route({
        method: 'GET',
        path: '/search',
        handler: (request, h) => {
            const query = request.query.q;
            return `Search query: ${query}`;
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
const Hapi = require('@hapi/hapi');

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a GET route with query parameter
    server.route({
        method: 'GET',
        path: '/search',
        handler: (request, h) => {
            const query = request.query.q;
            return `Search query: ${query}`;
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Call the initialization function
init();
JAVASCRIPT

/search?q=Hapi發送 GET 請求將傳回"搜尋查詢:Hapi"。

! hapi node js(開發者使用指南):圖 2 - 使用查詢參數進行路由輸出

運行伺服器

執行以下命令啟動伺服器:

node server.js
node server.js
SHELL

在您的終端機中,您應該會看到"伺服器正在 http://localhost:3000 運行"的訊息。當您造訪 http://localhost:3000 時,您的瀏覽器中將顯示"Hello, Hapi!"。

開始

IronPDF for Node.js 入門非常簡單! 具體步驟如下。

什麼是 IronPDF?

IronPDF是一個應用程式庫,旨在簡化 PDF 的建立、編輯和管理。 該工具允許開發人員從 HTML 文件中提取文字和圖像,合併多個 PDF 文檔,應用標題和浮水印等等。 開發者可以利用 IronPDF 的使用者友善 API 和豐富的文檔,輕鬆地以程式設計方式建立高品質的 PDF 文檔,從而簡化 PDF 的處理。 IronPDF 具備改善文件工作流程所需的所有功能和特性,無論是在產生帳單、報告或文件時,都能在各種環境下提供良好的使用者體驗。

! hapi node js(開發者使用方法):圖 3 - IronPDF

IronPDF 的特點

將 HTML 轉換為 PDF :您可以快速簡單地將 HTML 內容或靜態檔案(包括 CSS 和 JavaScript)轉換為 PDF 檔案。

PDF合併:為了簡化文件管理工作,可以將多個PDF文件合併為一個PDF文件。

文字和圖像提取:從 PDF 文件中提取文字和圖像,以便稍後進行處理或分析。

浮水印:出於安全或品牌推廣的原因,可以在 PDF 頁面中添加文字或圖片浮水印。

新增頁首和頁尾:在 PDF 文件中,新增帶有個人化文字或頁碼的頁首和頁尾。

安裝 IronPDF

若要啟用 IronPDF 功能,請使用 node 套件管理器安裝必要的 Node.js 套件。

npm install @ironsoftware/ironpdf
npm install @ironsoftware/ironpdf
SHELL

將 Hapi.js 與 IronPDF 集成

首先,設定一個簡單的 Hapi.js 伺服器來回應來自 Web 的傳入請求。 此伺服器已準備好接收產生 PDF 檔案的請求。

const Hapi = require('@hapi/hapi');
const IronPdf = require("@ironsoftware/ironpdf");

// Configure the IronPDF setup
const document = IronPdf.PdfDocument;
var config = IronPdf.IronPdfGlobalConfig;
config.setConfig({licenseKey: ''});

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a route for PDF generation
    server.route({
        method: 'GET',
        path: '/',
        handler: async (request, h) => {
            // Generate PDF here
            console.log('Connected');
            await generatePdf();
            return h.file('demo.pdf');
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Function to generate PDF from HTML using IronPDF
const generatePdf = async () => {
    const htmlContent = '<html><body><h1>Hello, IronPDF!</h1></body></html>';
    (await document.fromHtml(htmlContent)).saveAs('demo.pdf');
};

// Call the initialization function
init();
const Hapi = require('@hapi/hapi');
const IronPdf = require("@ironsoftware/ironpdf");

// Configure the IronPDF setup
const document = IronPdf.PdfDocument;
var config = IronPdf.IronPdfGlobalConfig;
config.setConfig({licenseKey: ''});

// Initialize the server
const init = async () => {
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Define a route for PDF generation
    server.route({
        method: 'GET',
        path: '/',
        handler: async (request, h) => {
            // Generate PDF here
            console.log('Connected');
            await generatePdf();
            return h.file('demo.pdf');
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

// Handle unhandled rejections
process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

// Function to generate PDF from HTML using IronPDF
const generatePdf = async () => {
    const htmlContent = '<html><body><h1>Hello, IronPDF!</h1></body></html>';
    (await document.fromHtml(htmlContent)).saveAs('demo.pdf');
};

// Call the initialization function
init();
JAVASCRIPT

我們配置一個伺服器來監聽連接埠 3000 上的 HTTP 調用,並導入 Hapi.js。 為了處理對根路徑/ HTTP GET 請求,定義了一個路由。 要使用 IronPDF 建立PDF 內容,我們在路由處理程序中呼叫generatePdf函數。 若要將 HTML 內容非同步渲染為 PDF 緩衝區,請匯入 IronPDF。 產生後,PDF 內容將作為回應傳回,並附有相關的內容類型(application/pdf)。 此外,我們配置了 Content-Disposition 標頭,以指定 PDF 是應作為附件下載還是在瀏覽器中內嵌顯示(選用)。

! hapi node js(開發者使用方法):圖 4 - PDF 輸出

結論

總而言之,在Node.js應用程式中使用Hapi.js和IronPDF可以快速建立PDF文檔,是一種強大的方法。 您可以按照本文提供的說明,快速設定 Hapi.js 伺服器來處理 HTTP 請求,並使用 IronPDF 從 HTML 內容建立 PDF 或執行其他 PDF 建立操作。

Hapi.js 為在 Node.js 中建立 Web 伺服器提供了一個功能全面且使用者友善的框架,其面向外部的介面使得建立路由和管理 HTTP 請求變得簡單。 IronPDF 增強了該框架的功能,提供了一套用於建立 PDF 的廣泛功能集,包括合併 PDF 文件、新增頁首和頁尾以及將 HTML 文字轉換為 PDF。

Hapi.js 和 IronPDF 是將 PDF 創建功能整合到 Node.js 應用程式中的可靠選擇,因為它們擁有豐富的文檔和活躍的開發者社群支援。 無論您的開發經驗程度如何,此整合都能為您提供一種簡單的方法,將 PDF 創建功能添加到您的應用程式中。

透過將 IronPDF 和 Iron Software 產品整合到您的開發堆疊中,我們可以保證為客戶和最終用戶提供功能豐富、高階的軟體解決方案。 此外,這將有助於專案和流程的最佳化。 Iron Software的價格從$799起。 這些工具非常適合現代軟體開發項目,因為它們擁有詳盡的文件、活躍的線上開發者社群和頻繁的升級。

Darrius Serrant
全棧軟件工程師 (WebOps)

Darrius Serrant 擁有邁阿密大學計算機科學學士學位,目前任職於 Iron Software 的全栈 WebOps 市場營銷工程師。從小就迷上編碼,他認為計算既神秘又可接近,是創意和解決問題的完美媒介。

在 Iron Software,Darrius 喜歡創造新事物,並簡化複雜概念以便於理解。作為我們的駐場開發者之一,他也自願教學生,分享他的專業知識給下一代。

對 Darrius 來說,工作令人滿意因為它被重視且有實際影響。