Git Product home page Git Product logo

moysklad-client's Introduction

moysklad-client

NPM

JavaScript клиент для работы с API сервиса МойСклад.

ВНИМАНИЕ! Библиотека использует устаревший на текущий момент XML REST API сервиса МойСклад. Взамен МойСклад предлагает использовать новый JSON API интерфейс. Разработка библиотеки для нового API ведется в другом репозитории

ВНИМАНИЕ! Код не покрыт тестами, поэтому будьте осторожны при использовании функционала обновления данных, т.к. есть вероятность наличия ошибок.

Информацию об ошибках, вопросы и предложениях просьба оставлять в разделе Issues

Пример использования

Пример кода в синхронном режиме:

var client  = require('moysklad-client').createClient(),

// Получаем самый большой заказ за 2013 год.
var order = client.from('customerOrder')
    .select({
        applicable: true,
        moment: client.between(new Date(2013, 0, 1), new Date(2013, 11, 31))
    })
    .orderBy('sum.sum', 'desc')
    .first();

// Привязываем ленивую загрузку, после чего можно будет обращаться к связанным сущностям, напр. order.sourceAgent.name
client.createLazyLoader().attach(order);

// Клиент оформивший заказ
var agent = order.sourceAgent;

console.log('Лучший клиент 2013 года - ' + agent.name);
console.log('оформил заказ на сумму ' + order.sum.sum / 100 + ' руб.');

// Давйте сделаем хорошему клиенту скидку 3%!
agent.discount = 3;

// Сохраним контрагента с измененной скидкой в МойСклад
client.save(agent);

Установка

Node.js

  1. Установка пакета:

    $ npm install moysklad-client --save
  2. Подключение:

    var client = require('moysklad-client').createClient();

Настройка библиотеки для других сред описана в разделе документации Быстрый старт

Особенности

  • Взаимодействие с МойСклад на любой платформе и среде где может выполнятся JavaScript код.
  • Поддержка синхронного (браузер, Google Script) и асинхронного (node.js) режима разработки.
  • Поддержка всех возможностей API МойСклад.
  • Реализована полная объектная модель сервиса на основе официальной схемы данных.
  • Описание объектной модели отделено от программного кода библиотеки, что сокращает расходы на поддержку при обновлениях МойСклад.

Документация

Документация представлена в разделе Wiki

Версии

Все изменения в разделе Releases

moysklad-client's People

Contributors

wmakeev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

moysklad-client's Issues

Реализовать методы client.max / client.min

Получает сущность с максимальным/минимальным значением указанного свойства

  • client.max
var order = client.max('customerOrder', 'updated');
// аналогично
var order = client.from('customerOrder').sortBy('updated', 'dsc').first();
  • client.min
var order = client.min('customerOrder', 'updated');
// аналогично
var order = client.from('customerOrder').sortBy('updated', 'asc').first();

Ошибка сервера 429 (слишком много запросов за единицу времени)

При большом количестве последовательных или параллельных запросов к REST API часто возникает ошибка 429 - The user has sent too many requests in a given amount of time.

Экспериментальным путем установлено, что сервис не позволяет выполнять более 2-х одновременных запросов и таймаут между запросами должен быть примерно не менее 250 ms.

Необходимо реализовать встроенную очередь запросов, которая будет учитывать описанные выше ограничения.

tools.getPositions

Метод tools#getPositions должен возвращать пустой массив (вместо null) для сущности с позициями, если позиции не указаны.

Метод проверки авторизации

Добавить метод проверки пройденной авторизации на сервисе.
Будет полезно для тех случаев, когда библиотека работает на странице приложения МойСклад и необходимо определить нужно ли проходить авторизацию или есть возможность обращаться к сервису под текущим логином и паролем пользователя используя текущую сессию.

Пропускать неописанные в объектной модели элементы XML без генерации ошибки

Когда, в процессе преобразования XML в JSON объекты, встречается неописанный в модели элемент, генерируется ошибка "Unexpected element". Такая ситуация возникает каждый раз при обновлениях модели на стороне МойСклад. И хотя уже реализован ряд решений (#10, #27) чтобы быстро реагировать на такие случаи, факт появления такой ошибки не является нормой.

Необходимо обеспечить игнорирование новых не известных элементов без выведения ошибок.

Дополнить функционал ленивого загрузчика

В текущей версии реализованы не все возможности ленивой загрузки полей с нестандартными названиями и полей метаданных. Добавить всё возможное, что не требует дополнительного рефакторинга.

В том числе, реализовать метод получения сущностей по идентификатору из кеша экземпляра ленивого загрузчика.

Taist manifest

Автоматическая генерация манифеста для Taist сборки

Загрузка текущей сущности (в браузере)

Добавить возможность загрузки текущей сущности в сборке для браузера.
К примеру, client.load(), вернет сущность в активной вкладке браузера без указания типа и идентификатора.

Версионность схемы данных

При сохранении истории сущностей, будет необходимо решить задачу определения версии схемы данных, использованной при генерации сущности. Адаптеры для различных версий можно привязывать к версии схемы данных.

В node.js не работает пример из вики

Добрый день.
Хотел сегодня попробовать библиотеку, обломался на самом первом этапе. Пример для синхронной работы не работает, хотя в Google Script, к примеру все нормально, браузер по генерируемым ссылкам тоже корректно все отдает.

Версия ноды v0.10.25
Версия библиотеки v0.2.8
Установлено из офф. репов и на на Ubuntu 14.04.3 LTS.

Используемый код:

var Sync = require('sync'),
    client = require('moysklad-client').createClient("login","password");

Sync(function () {

    var order = client.from('customerOrder')
        .sort('moment', 'desc')
        .first();

    console.log(order);
    return order.name;

}, function (err, data) {
    if (err) console.error(err);
    console.log(data);
});

Возвращает вот что:

# nodejs server.js 
moysklad-client info: moysklad-client v0.2.8 (index.js:12)
moysklad-client info: http GET https://online.moysklad.ru/exchange/rest/ms/xml/CustomerOrder/list/?sort=moment&sortMode=desc&count=1 (node.js:30)
null
[TypeError: Cannot read property 'name' of null]
undefined
moysklad-client info: http 200 https://online.moysklad.ru/exchange/rest/ms/xml/CustomerOrder/list/?sort=moment&sortMode=desc&count=1 116ms 1780b (node.js:49)

В чем может быть затык? И еще, я вижу, что библиотека пытается юзать REST сервис, а JSON API она еще не умеет?

Ошибка: Error: Can't sleep in node.js async env.

Пока не понял, в какой момент получается (99% времени все нормально), но иногда появляется. Раньше не было.

Также, перед ней выскакивает другая ошибка: TypeError: Cannot read property 'headers' of undefined. Опять же, очень редко.

Такое ощущение, что при изменении атрибутов объекта.

Поддержка Promises

Реализовать поддержку Promises в асинхронном режиме.

Учитывая грядущие в ES7 async/await, такая возможность даст значительные преимущества

var action = async function (uuid) {
    var order;
    var client = require('moysklad-client').createClient();
    await client.loadMetadata();
    try {
        order = await client.load('customerOrder', uuid);
    } catch (err) {
        // обработка ошибки
        throw err;
    } 
    ...
    return order;
}

action('08ed3f99-3e2f-11e3-f600-7054d21a8d1e').then(function(order) {
    console.log(order.name);
}).catch(function(err) {
    throw err;
})

Подгрузка метаданных для расширенного доступа к атрибутам

Для более гибкой работы с атрибутами объектов, требуются данные из метаданных аккаунта: EmbeddedEntityMetadata и CustomEntityMetadata.

Поэтому, при необходимости расширенного взаимодействия с атрибутами сущностей, должна быть возможность принудительно подгрузить метаданные.

Пример в синхронном режиме:

Создаем клиент

var client = require('moysklad-client').createClient();

Подгружаем метаданные (в данном примере синхронно) и получаем последний обновленный заказ покупателя

client.loadMetadata();
var order = client.max('customerOrder', 'updated');

Предположим, что у нас есть текстовое пользовательское поле Адрес доставки.
Учитывая, что метаданные уже загружены, то возможно получить значение атрибута Адрес доставки, по наименованию атрибута.

// Получение значения атрибута по имени
var shippingAddress = order.getAttr('Адрес доставки').valueString;  // → г.Ставрополь, ул. Ленина, 200

// через универсальный метод .getValue
var shippingAddress = order.getAttr('Адрес доставки').getValue();  // → г.Ставрополь, ул. Ленина, 200

// или методом .getAttrValue
var shippingAddress = order.getAttrValue('Адрес доставки');  // → г.Ставрополь, ул. Ленина, 200

Если пользовательское поле типа "Справочник", то методы getAttrValue и getValue вернут идентификатор сущности связанного элемента справочника.

var shippingTypeUuid = order.getAttr('Способ доставки').getValue(); // → 08ed3f99-3e2f-11e3-f600-7054d21a8d1e

Обновить документацию

В документации необходимо отразить изменения, которые были внесены с последними обновлениями.

Подключение объектной модели в качестве внешнего модуля

  • Выделить подсистему генерации объектной модели (XML <--> JSON маппинг) в отдельный модуль для оптимизации внесения обновлений и уменьшения размера исходной библиотеки.
  • В ряде случаев не требуется полная объектная модель или необходима модификация модели под конкретное решение

Регистронезависимая запись типа сущности

// Поддерживается
client.load('customerOrder', uuid);
client.load('CustomerOrder', uuid);

// Не поддерживается (необходимо реализовать)
client.load('customerorder', uuid);

Последняя запись удобна при написании аддонов к приложению МойСклад, когда тип сущности получается из url страницы, где запись типа всегда в нижнем регистре.

var client = require('moysklad-client').createClient();
var router = require('moysklad-router').start();

// Загружает документ который сейчас открыт на экране пользователя
var currentDocument = client.load(router.state.section, router.state.query.id);

При обновлении на 0.2.8 перестало работать (относится к Meteor)

Недавно обновил версию, теперь при попытке вызова любого метода - пишет:
Cannot find module 'common-node/lib/httpclient'

Может дело в метеоре - я к нему подключаю, не напрямую к Node.js, но версия 0.2.6 работала без проблем.

Update: пытался откататься обратно к 0.2.6, выдало целый фонтан ошибок:
While building package npm-container: error: couldn't install npm package [email protected]: Command failed: npm http GET https://registry.npmjs.org/moysklad-client npm http 304 https://registry.npmjs.org/moysklad-client npm http GET https://registry.npmjs.org/colors npm http GET https://registry.npmjs.org/common-node npm http GET https://registry.npmjs.org/lodash npm http GET https://registry.npmjs.org/moment npm http GET https://registry.npmjs.org/stampit npm http GET https://registry.npmjs.org/tracer npm http GET https://registry.npmjs.org/xmldom npm http 304 https://registry.npmjs.org/colors npm http 304 https://registry.npmjs.org/lodash npm http 304 https://registry.npmjs.org/moment npm WARN deprecated [email protected]: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^4.0.0. npm http 304 https://registry.npmjs.org/xmldom npm http 304 https://registry.npmjs.org/common-node npm http 304 https://registry.npmjs.org/stampit npm http 304 https://registry.npmjs.org/tracer npm http GET https://registry.npmjs.org/mime-types npm http GET https://registry.npmjs.org/dateformat npm http GET https://registry.npmjs.org/tinytim npm http 304 https://registry.npmjs.org/mime-types npm http 304 https://registry.npmjs.org/dateformat npm http GET https://registry.npmjs.org/mout npm http 304 https://registry.npmjs.org/mout npm http 304 https://registry.npmjs.org/tinytim npm http GET https://registry.npmjs.org/fibers npm http 304 https://registry.npmjs.org/fibers gypBuild failed "nodejs" �� ����� ����७��� ��� ���譥� ��������, �ᯮ��塞�� �ணࠬ��� ��� �������� 䠩���. npm ERR! Error: ENOENT, lstat 'C:\Meteor\zupjs-old\zupjs\packages\npm-container\.npm\package-new-149zeh4\node_modules\moysklad-client\node_modules\stampit\node_modules\mout\src\queryString\decode.js' npm ERR! If you need help, you may report this *entire* log, npm ERR! including the npm and node versions, at: npm ERR! <http://github.com/npm/npm/issues>

и так еще два экрана.

tools.clone и externalcode

tools.clone должен помимо удаления идентификатора uuid удалять и поле externalcode

Ошибка разрешения зависимостей в node.js после установки пакета через npm 3.x

Начиная с 3-ей версии npm загружает граф зависимостей иначе чем в прежних версиях. По этой причине в одном из модулей сломалась ссылка на библиотеку node-fibers, т.к. эта ссылка была указана с учетом внутренней структуры каталога node_modules.

Ошибка модели данных в версии 0.2.8

Модель данных МойСклад преобразуется из xsd-модели во внутреннее представление автоматически, но в процессе трансформации применяется несколько заплаток с целью исправить некоторые неудобные моменты. В новой модели одна из таких заплаток сработала не корректно. Ошибка коснулась сущности Good (выпали некоторые поля, к примеру buyPrice).

Необходимо оптимизировать применение таких заплаток, чтобы избежать возможных ошибок в будущем.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.