Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koltyakov/a1002f7fe823fbb1c073a53c8c90027c to your computer and use it in GitHub Desktop.
Save koltyakov/a1002f7fe823fbb1c073a53c8c90027c to your computer and use it in GitHub Desktop.
Using PnP JS Core outside a browser (Node.js environment)

Использование PnP JS Core за пределами браузера (в среде Node.js)

Расширяем области применения любимых инструментов

Осенью прошлого года я писал об первоначальном опыте использования PnP JS Core, прошло вот уже как 9 месяцев. В том посте я поделился первыми впечатлениями использования библиотеки и решением использовать ее на боевых проектах.

Что же я могу поведать по прошествии времени? Сейчас, для меня и команды, PnP JS Core стала почти обязательной и включаемой по умолчание в шаблоны сборок front-end проектов для SharePoint. Честно говоря, я практически забыл, когда в последний раз приходилось прибегать к помощи старичка JSOM (sp.js) для взаимодействия с объектами SharePoint API в рамках UI-приложений. JS Core предоставляет интерфейс к почти всем доступным часто используемым элементам REST API. Конечно не без проблем самого REST, есть довольно много чего, что в REST по каким-то причинам не реализовано или не работает (нет API для управляемых метаданных, ограничения интерфейса профилей пользователей и пр.), но без этого в принципе можно жить или есть обходные пути. В части поддерживаемых методов PnP JS Core отлично справляется со своими задачами.

В рамках пары проектов я столкнулся с необходимостью коммуникации с SharePoint в рамках работы с данными и метаданными непосредственно из окружения Node.js с использованием REST. При этом поймал себя на мысли, что руки сами пишут строки на PnP JS Core. В целом нет никакой проблемы подготовить URI запроса и JSOM пакет и выполнить REST запрос в чистом виде. Но, как бы было круто максимально унифицировать кодовую базу, когда это можно и применять одни и те же инструменты, что на клиенте в браузере, что на клиенте/сервере вне браузерной сессии.

К счастью, я не один такой и народ уже эксперементировал с данной проблематикой и даже создавал проекты-примеры на GitHub. Поэтому перенять работающие концепты и завести PnP JS Core в Node.js особого труда не составило.

Предлагаемый метод выполнения JS Core в V8 Node.js заключается в "патчинге" глобальной переменной, заголовков запросов и fetch-клиента. Способ отлично работает и зарекомендовал себя в боевых проектах, где подобным образом у нас производится обработка данных.

Чуть позже появилось необходимость повторить реализацию в рамках другого проекта и не одного, встал вопрос, рационального переиспользования без копирования кода между проектами.

Отличная ситуация для того, чтобы подобный инструментарий обернуть в переиспользуемую библиотеку по необходимости подключаемую к проектам. Сказано, сделано. В итоге была создана библиотека sp-pnp-node, которая абстрагирует необходимость натчинга http клиента вручную и минимизирует лишний код.

Установить библиотеку можно с помощью NPM или Yarn:

NPM

npm install sp-pnp-node --save

Yarn

yarn add sp-pnp-node --save

После чего библиотеку можно задействовать в JavaScript'е или, в последнее время предпочитаю, TypeScript'е.

Использование в TypeScript

import { PnPNode } from 'sp-pnp-node';
import { Web } from 'sp-pnp-js';

(new PnPNode()).init().then((settings) => {

    // Далее можно осуществлять вызовы PnP JS Core
    let web: Web = new Web(settings.siteUrl);

});

Использование в ES6

const PnPNode = require('sp-pnp-node').PnPNode;
const pnp = require('sp-pnp-js');

(new PnPNode()).init().then((settings) => {

    // Далее можно осуществлять вызовы PnP JS Core
    let web = new pnp.Web(settings.siteUrl);

});

Несколько строк инициализации и PnP JS Core заработает вне браузера.

При инициализации PnPNode можно указать дополнительные настройки, однако, основная идея при создании библиотеки была в том, чтобы минимизировать и упростить конструкцию инициализации, поэтому настройки по умолчанию подойдут для большинства сценариев. При первоначальном запуске, обертка произведен инициализацию подключения к среде SharePoint, в рамках которой в режиме мастера необходимо будет заполнить авторизационные параметры. Введенные параметры сохраняются в конфигурационный файл, пароль хешируется.

Знакомые с моими проектами знают, что у меня много где задействована библиотека node-sp-auth, отвечающая за аутентификацию в SharePoint. Для того, чтобы между разными проектами был единый подход к настройкам аутентификации приложений была создана библиотека node-sp-auth-config. Она в том числе, интегрирована в sp-pnp-node.

Заключение

Я определенно рекомендую PnP JS Core под задачи, для которых она была спроектирована и создана. Девять месяцев плотного использования библиотеки - довольно убедительный аргумент.

Помимо работы в контексте браузера, PnP JS Core, с использованием таких оберток, как sp-pnp-node, способна на выполнение запросов в рамках приложений на Node.js, таких как консольные приложения, задачи по расписанию, микросервисы, приложения на Electron.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment