guideNode.js 中的导入和导出功能

本文介绍了一个使用 Node.js 和 Express.js 中 导入和导出功能 的应用程序示例。

# 依赖项

此示例使用以下依赖项

  • axios
  • body-parser
  • cors
  • express

它还使用 Node.js 的核心依赖项:pathfs

# 示例

以下示例允许您上传 编辑器捆绑包,将文档数据导入 CKEditor 云服务,并导出协作内容。

此文件提供了一个简单的 Express.js 应用程序的示例。

请记住提供正确的 API 密钥并生成正确的 请求签名

// index.js
const path = require( 'path' );
const fs = require( 'fs' );
const express = require( 'express' );
const axios = require( 'axios' );
const cors = require( 'cors' );
const bodyParser = require( 'body-parser' );
const generateSignature = require( './utils/generateSignature' ); // See: https://ckeditor.npmjs.net.cn/docs/cs/latest/examples/security/request-signature-nodejs.html.
const editorBundle = fs.readFileSync( path.resolve( '../client/build/ckeditor.js' ) ); // This should be your bundled editor.

const app = express();
const port = 8000; // The default application port.
const bundleVersion = 'bundleVersion'; // This value should be unique per environment.
const apiSecret = 'SECRET'; // Do not forget to hide this value in a safe place e.g. an .env file!
const organizationId = 'organizationId'; // Type your organization ID here.
const environmentId = 'environmentId'; // Type your environment ID here.
// If you use On-Premises application you can adjust baseApiUrl accordingly with your application URL.
const baseApiUrl = `https://${ organizationId }.cke-cs.com/api/v5/${ environmentId }`;

app.use( bodyParser.urlencoded( { extended: true } ) );
app.use( bodyParser.json() );
app.use( cors() );

// This function will be responsible for sending requests to CKEditor Cloud Services API.
async function sendRequest( method, url, body ) {
    const CSTimestamp = Date.now();
    const payload = {
        method,
        url,
        mode: 'no-cors',
        headers: {
            'Content-Type': 'application/json',
            'X-CS-Signature': generateSignature( apiSecret, method, url, CSTimestamp, body ),
            'X-CS-Timestamp': CSTimestamp
        }
    };

    if ( method.toUpperCase() !== 'GET' ) {
        payload.data = body;
    }

    try {
        const { status, data } = await axios( payload );

        return { status, data };
    } catch ( { response } ) {
        const { status, data } = response;

        return { status, data };
    }
}

// Upload the editor bundle. Note that you will need to upload your editor again if you change the bundle.
app.post( '/upload-editor', async ( req, res ) => {
    const { bundleVersion } = req.body;

    const { status, data } = await sendRequest( 'POST', `${ baseApiUrl }/editors`, {
        bundle: editorBundle.toString(),
        config: {
            cloudServices: {
                bundleVersion
            }
        }
    } );

    return res.json( { status, data } );
} );

// Import content to the document.
app.post( '/import', async ( req, res ) => {
    const { documentId, documentContent, bundleVersion } = req.body;

    const { status, data } = await sendRequest( 'POST', `${ baseApiUrl }/collaborations`, {
        document_id: documentId,
        bundle_version: bundleVersion,
        data: documentContent
    } );

    return res.json( { status, data } );
} );

// Export your data from CKEditor Cloud Services. You can schedule export operations e.g. once per hour.
app.get( '/export/:documentId', async ( req, res ) => {
    const { documentId } = req.params;

    const { status, data } = await sendRequest( 'GET', `${ baseApiUrl }/collaborations/${ documentId }` );

    return res.json( { status, data } );
} );

app.listen( port, () => console.log( `The application is listening on port ${ port }!` ) );

# 用法

运行

node index.js

然后,您可以通过向此应用程序发送 HTTP 请求来执行操作并与 CKEditor 云服务进行通信。请查看以下示例

  1. 上传编辑器捆绑包。
try {
    const response = await fetch( 'http://localhost:8000/upload-editor', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify( { bundleVersion } )
    } );

    const data = await response.json();

    console.log( 'Result of uploading editor:', data );
} catch ( error ) {
    console.log( 'Error occurred:', error );
}
  1. 导入协作会话。
try {
    const response = await fetch( 'http://localhost:8000/import', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify( { 
            bundleVersion,
            documentId: 'document-1',
            documentContent: '<p>Lorem Ipsum is <b>simply dummy</b> text of the printing and typesetting industry.</p>',
        } )
    } );

    const data = await response.json();

    console.log( 'Result of importing collaborative editing session:', data );
} catch ( error ) {
    console.log( 'Error occurred:', error );
}
  1. 导出协作会话。步骤 2 中导入的内容应被返回。
try {
    const response = await fetch( `http://localhost:8000/export/document-1`, {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        }
    } );

    const data = await response.json();

    console.log( 'Result of exporting collaborative editing session:', data );
} catch ( error ) {
    console.log( 'Error occurred:', error );
}