HCL Domino AppDevPack - Проблема с написанием форматированного текста

Я использую код, предложенный в качестве примера в документации к Domino AppDev Pack 1.0.4 единственная разница заключается в чтении текстового файла (body.txt) в качестве буфера, который содержит только простой длинный текст (40Ko).

Когда он выполняется, документ создается в базе данных, и остальная часть кода не возвращает ошибку. Но, наконец, в документ не было добавлено поле RTF. Здесь был получен ответ:

response: {"fields":[{"fieldName":"Body","unid":"8EA69129BEECA6DEC1258554002F5DCD","error":{"name":"ProtonError","code":65577,"id":"RICH_TEXT_STREAM_CORRUPT"}}]}

Моя цель - написать очень длинный текст (более 64 Ko) в поле с форматированным текстом. Я использую в примере текстовый файл для буфера, но позже он может быть что-то вроде const buffer = Buffer.from ('very long text ...')

Это правильный путь или нужно делать по-другому?

Я использую систему Windows с IBM Domino (r) Server (64 бит), выпуск 10.0.1FP4 и AppDevPack 1.0.4.

Заранее спасибо за вашу помощь

Вот код:

const write = async (database) => {
  let writable;
  let result;
  try {
    // Create a document with subject write-example-1 to hold rich text
    const unid = await database.createDocument({
      document: {
        Form: 'RichDiscussion',
        Title: 'write-example-1',
      },
    });
    writable = await database.bulkCreateRichTextStream({});
    result = await new Promise((resolve, reject) => {
      // Set up event handlers.
      // Reject the Promise if there is a connection-level error.
      writable.on('error', (e) => {
        reject(e);
      });
      // Return the response from writing when resolving the Promise.
      writable.on('response', (response) => {
        console.log("response: " + JSON.stringify(response));
        resolve(response);
      });
      // Indicates which document and item name to use.
      writable.field({ unid, fieldName: 'Body' });
      let offset = 0;
      // Assume for purposes of this example that we buffer the entire file.
      const buffer = fs.readFileSync('/driver/body.txt');
      // When writing large amounts of data, it is necessary to
      // wait for the client-side to complete the previous write
      // before writing more data.
      const writeData = () => {
        let draining = true;
        while (offset < buffer.length && draining) {
          const remainingBytes = buffer.length - offset;
          let chunkSize = 16 * 1024;
          if (remainingBytes < chunkSize) {
            chunkSize = remainingBytes;
          }
          draining = writable.write(buffer.slice(offset, offset + chunkSize));
          offset += chunkSize;
        }
        if (offset < buffer.length) {
          // Buffer is not draining. Whenever the drain event is emitted
          // call this function again to write more data.
          writable.once('drain', writeData);
        }
      };
      writeData();
      writable = undefined;
    });
  } catch (e) {
    console.log(`Unexpected exception ${e.message}`);
  } finally {
    if (writable) {
      writable.end();
    }
  }
  return result;
};

person Fred Burette    schedule 24.04.2020    source источник


Ответы (1)


Начиная с пакета appdev 1.0.4, поток RTF принимает данные записи действительного формата CD RTF в наборе символов LMBCS. В настоящее время мы работаем над библиотекой, которая поможет вам записывать в поток действительные данные в формате RTF.

Я хотел бы услышать больше о ваших вариантах использования, и мы очень рады, что вы уже разбираетесь в этой функции! Если вы можете присоединиться к каналу openntf slack, я обычно там зависаю.

person ddumont    schedule 24.04.2020
comment
Спасибо за ваш ответ, я буду терпелив ... Я считаю решение App Dev Pack очень успешным: используйте лучшее из Domino и NodeJS, и оно работает очень хорошо, все эти новые функции очень привлекательны для тех, кто занимается веб-разработкой с домино !!! - person Fred Burette; 24.04.2020