Ответы пользователя по тегу Node.js
  • В чем же сила Node.js ?

    1. Как сказали, очень круто что это один язык на фронтэнде и бэкенде. Это пожалуй самое основное и ценное преимущество перед многими другими бэкенд технологиями, если вы разрабатываете не просто вэб страничку, а динамическое вэб приложение.
    И замечу, что тут даже не важно что это javascript. Именно важно переиспользование модулей и компонент по обе стороны, а также единая "экосистема". Это часто недооценивают, начинают сравнивать разные аспекты например php vs javascript, go vs javascript, но это не столь важно.
    2. Ещё раз, язык который используется в ноде, можно использовать для дэсктоп приложений (nodewebkit) и мобильных приложений (phonegap).
    3. NodeJS это не только серверные приложения, а также различные консольные утилиты и разные дэв. скрипты.
    Ответ написан
    2 комментария
  • Существуют ли ORM с возможностью работы поверх HTTP на Node.js?

    Если монго будете выбирать, вот пример для [Class](https://github.com/atmajs/classjs). Правда http сервис нужно отдельно писать, но в основном это и так надо, потому что редко можно обойтись CRUD методами, обычно логика поведения посложнее.
    // entity/user.js
    var User = Class('User', {
        Base: Class.Serializable({
            activity: Date
        }),
        Validate: {
            activity (date) {
                if (date.getFullYear() !== new Date().getFullYear()) 
                    return 'Current year expected';
            }
        },
        _id: null,
        activity: null,
        points: 0,
    });
    // client/user.js
    Class.patch('User', {
        Store: Class.Remote('/rest/user/:_id')
    })
    // server/user.js
    Class.patch('User', {
        Store: Class.MongoStore.Single('users', {
            indexes: [ { date: 1} ]
        })
    });
    
    // Browser OR NodeJS
    var user = new User({
        _id: 'foo',
        activity: new Date
    });
    user.save().done(() => {});
    //
    user
        .patch({
            $inc: {
                points: 2
            }
        })
        .done(() => {})
    //
    User.fetch({ _id: 'foo' }).done(user => {});
    User.fetch({ points: '>10' }).done(user => {});
    
    // Server, http endpoint sample
    module.exports = atma.server.Service({
        '$post /' (req) {
            var user = new User(req.body),
                error = Class.validate(user);
            if (error) 
                return this.reject(error);
            
            user.save().pipe(this);
        }
    })
    Ответ написан
    Комментировать
  • Есть ли лучше способ перейти от event-ов к callback-у в NodeJS?

    Вот ещё варианты:
    var SuperModule = require('SuperModule');
    var start_ = SuperModule.prototype.start;
    
    SuperModule.prototype.start = function(cb){
        var fn = onceDelegate(cb);
        this
            .once('started', fn)
            .once('error', fn)
            ;
        start_.call(this);
    };
    
    function onceDelegate(fn) {
        return function(){
            var x_ = fn;
            fn = null;
            x_ && x_.apply(null, arguments);
        };
    }
    
    
    // ИЛИ, если сделать более общим:
    function callbackInjector(Ctor, method, events) {
        var orig_ = Ctor.prototype[method];
        
        Ctor.prototype[method] = function(){
            var args = Array.prototype.slice.call(arguments),
                cb = args.pop(),
                listener = onceDelegate(cb),
                imax = events.length,
                i = -1
                ;
            while(++i < imax) this.once(events[i], listener);
            return orig_.apply(this, args);
        }
    };
    
    callbackInjector(SuperModule, 'start', ['started', 'error']);
    Ответ написан
    Комментировать
  • Как сделать два и более веб сайтов + бекенд в проекте node.js и запустить под разными доменами?

    Если ипосльзуется iis, тогда рекомендую https://github.com/tjanczuk/iisnode модуль, тогда за старт и расспределение будет отвечать IIS - где собственно вы как обычно создаете сайты и bindings.
    Ответ написан
    Комментировать
  • NodeJS одновременная запись в один файл

    Вам нужно взять diff библиотеку - например: jsdiff. После редактирования отправляете на сервер patch, который и применяете к тексту. Если пользователи редактируют разные участки текста оба изменения останутся, если же один участок, тогда - вам нужно думать о разрешении конфликтов. Самое простое - "кто последний - того и тапки".
    Ответ написан
    Комментировать
  • JS promise, как работать в рекурсии?

    rsvp:Chaining
    В первом `then` создаете и возвращаете ещё один промис, внутри которого делаете вашу `theFunction` рекурсию и когда готовы делаете ресолв. И так переходите ко второму `then`.
    Ответ написан
    Комментировать
  • Какую СУБД лучше выбрать для Node.js и есть ли разница?

    Всё же платформу тоже нужно учитывать: если node.js, то я взял бы монгу. Javascript обьекты и nosql базы можно сказать братья) Работать с ними будет очень удобно. Я бы даже предложил взять очень классный модуль для сериализации обьектов в монгу:ClassJS. Смотрите как просто создаются модели для Ajax транспорта и MongoDB драйвера gist

    Если же нужно очень много взаимосвязей между таблицами, то в nosql базах это будет сложно настроить. Лучше выбрать тогда MySQL.
    Ответ написан
    3 комментария
  • Какой принцип использовать для хранения данных в MongoDB?

    Рекомендую почитать "50 Tips and Tricks for MongoDB". Текста не много, а информации полно. Здесь в ответах немного напутали - то, что у вас под 1ым пунктом - это денормализованная коллекция. Плюсы в том, что за один запрос имеете всю информацию по обьекту, ну а минусы соответственно, что сложно применять правки. А 2ой пункт, это уже нормализованная - и тут всё наоборот. Но главное, это грамотно балансировать между ними, а не выбирать одну из сторон. Структура очень зависит не только от структуры данных, но и того - как мы используем эти данные (какие выборки делать будем) и на сколько важна их актуальность. Пару советов из разных сторон:
    - если идете по первому пути - то можете хранить также все подсущности в отдельных коллекциях. Изменяя подсущность, изменяете её в своей коллекции, и не бойтесь писать скрипты для нормализации, которые по крону будут актуализировать основную коллекцию.
    - а если по второму, то храните не только `_id` подсущностей, но также часть обьекта, которая всегда будет нужна, что бы минимизировать запросы.
    Ответ написан
    Комментировать
  • Как настроить синхронизацию проекта на github и production сервера?

    Всё довольно просто - вэб хук на гитхабе, который стучится `постом`, например, к `http://mydomain/fetch`. На сервере висит обработчик который запускает скрипт, который в свою очередь делает `git pull`. Вот и всё.

    Вот пример как запускать сторонний скрипт, так же можно и `git fetch --all` / `git reset --hard origin/master` запускать
    require('child_process').spawn('cmd', ['/C', 'node', 'tools/fetch.js']);


    А так можно делать файл `touch`, и так как `iisnode` по-дефолту слушает `index.js` - сервер перезапустится.
    require('fs').utimesSync('index.js', new Date(), new Date());
    Ответ написан
    Комментировать
  • "Event chaining" в node.js

    Что касается первого вопроса, я делаю так:
    var await = new (require("atma-class")).Await;
    
    self.once("itemlist", await.delegate());
    self.once("photos", await.delegate());
    
    await
        .done(function() {
            self.emit("end");
        })
        .fail(function(error) {
            self.emit("error", error);
        });
    Ответ написан
    Комментировать
  • Из-за чего странное поведение express.use() в Node JS?

    `use` нужно использовать перед маршрутизатором. Из второго примера, когда вы регистрируете `/1` создается маршрутизатор express:application:L409. И когда регистрируется `/2`, то путь добавляется к уже существующему маршрутизатору, который находится перед `use`.
    Ответ написан
  • Node.js в качестве server-side для enterprise приложения?

    Расскажу свою историю. Раньше моим идеалом приложения было — толстый фронтенд + тяжелые WCF(asp.net) сервисы. Мы как порядочные разработчики и свой фронтэндовый фрэймворк создали. И радовались до тех пора пока не получили заманчивый заказ, но одним из условий — некоторые клиенты с выключенным javascript. Возвращаться к asp.net mvc не хотелось, так и пришло знакомство с нодой. Переделали немного фронтенд фрэймворк, и теперь все компоненты летают и там, и там. И что интересно, можем ограничивать компонент только фронтэндом, или если он манипулирует важными моделями — то только бэкенд. Ещё хорошим открытием стал для нас iisnode модуль — о всех кластерах ноды, логированиe, рестартаx (или падениях ноды) нам даже не нужно беспокоится, и плюс все работает параллельно с WCF сервисами. Вообщем мы пока что рады как слоны)
    Ответ написан
    Комментировать
  • JavaScript меня в могилу сведет [Node.js]

    операторы

    Как видите function call ниже оператора new, и если выделить скобками вашу запись, то интерпретатор делает следующее —
    var model1 = (new require('./test/model1'))();
    

    Функция require отработает хорошo, даже не зависимо от какого контекста была вызвана — а последующий function call будет уже в контексте global
    self == model1 == model2 == global

    Разные решения:
    var module = new (require('module'))();
    // екзотические варианты -
    var module = new require('module').prototype.constructor();
    var module = new new require('module')();
    
    Ответ написан
    Комментировать
  • Объединение файлов JS в один?

    Предложу свой вариант —
    $ npm install includejs -g
    $ ijs import -files myfile.js -output done.js
    # или так, все файлы в дериктории:
    $ ijs import -files builds/*.js -output lib/
    

    Примеры
    исходник
    скрипт для includejs
    результат
    Ответ написан
    1 комментарий
  • IDE для Node.js?

    Komodo IDE — не встречал ничего лучшего, или просто мало всего на пути попадалось? В любом случае -удовлетворяет всем желаниям) А уже в алфа 7 имеется поддержка node.js: announce
    Ответ написан
    Комментировать
  • Node.js (или другие асинхронные фреймворки): А как отлавливать ошибки?

    К node.js имею косвенное отношение, но мне всегда казалось, что:
    • всеми силами надо избегать выброса исключений, а возвращать статус ошибки
    • вызов ассинxорнной функции должен иметь вид:
      asyncFunction(args, function(error, result){})
    И теперь, если перевести эти пункты на ваш код:
    auth.getUser(req, function(error,user) {
      if (error != null){
        handle(res,error);
        return;
      }
      db.getData(function(error,data) {
        if (error != null){
          handle(res,error);
          return;
        }
      res.write(template.render(data));
    });

    Проверки исключений здесь, мне кажется, излишни. Слабое место только template.render(data), надо просто проверить или эта функция бросает исключения. И даже если да, то лучше проверить или объект data валидный перед передачей в render. Пока сам придерживаюсь правила, если в функции для ее нормальной работы надо больше 2/3 if-ов, тогда только try..catch. К сожалению, в Яваскрипте нельзя так гибко обращаться с исключениями как в .NET(печальный вздох). Буду тоже рад если, кто то предложит более конструктивный ответ.
    Ответ написан
    1 комментарий