Giter Club home page Giter Club 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

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

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

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

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

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

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

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

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

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

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

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

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

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

При обновлении на 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.getPositions

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

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

Для более гибкой работы с атрибутами объектов, требуются данные из метаданных аккаунта: 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

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

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

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

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

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

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

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

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

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

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

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

// Поддерживается
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);

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

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

Реализовать методы 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();

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

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

tools.clone и externalcode

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

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

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

Поддержка 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;
})

Taist manifest

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

В 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 она еще не умеет?

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.