Close Menu
Soshace Digital Blog

    Subscribe to Updates

    Get The Latest News, Updates, And Amazing Offers

    What's Hot
    Interview

    Interview with Anuar Akhmetov: I Was Apathetic of Programming until I Met My Very Best Mentor

    JavaScript

    Monthly Digest of the Most Popular JS Github Repositories

    Entrepreneurship

    Oksana Trypolska: I Don’t Know Any Person Who, After Working Remotely, Returned to the Office

    Important Pages:
    • Home
    • About
    • Services
    • Contact Us
    • Privacy Policy
    • Terms & Conditions
    Facebook X (Twitter) Instagram LinkedIn YouTube
    Today's Picks:
    • Scaling Success: Monitoring Indexation of Programmatic SEO Content
    • Leveraging Influencers: Key Drivers in New Product Launches
    • How Privacy-First Marketing Will Transform the Industry Landscape
    • The Impact of Social Proof on Thought Leadership Marketing
    • Balancing Value-Driven Content and Promotional Messaging Strategies
    • Top Influencer Marketing Platforms to Explore in 2025
    • Emerging Trends in Marketing Automation and AI Tools for 2023
    • Strategies to Mitigate Duplicate Content in Programmatic SEO
    Wednesday, September 10
    Facebook X (Twitter) Instagram LinkedIn YouTube
    Soshace Digital Blog
    • Home
    • About
    • Services
    • Contact Us
    • Privacy Policy
    • Terms & Conditions
    Services
    • SaaS & Tech

      Maximizing Efficiency: How SaaS Lowers IT Infrastructure Costs

      August 27, 2025

      Navigating Tomorrow: Innovations Shaping the Future of SaaS

      August 27, 2025

      Maximizing Impact: Strategies for SaaS & Technology Marketing

      August 27, 2025
    • AI & Automation

      Enhancing Customer Feedback Analysis Through AI Innovations

      August 27, 2025

      Navigating the Impact of AI on SEO and Search Rankings

      August 27, 2025

      5 Automation Hacks Every Home Service Business Needs to Know

      May 3, 2025
    • Finance & Fintech

      Critical Missteps in Finance Marketing: What to Avoid

      August 27, 2025

      Analyzing Future Fintech Marketing Trends: Insights Ahead

      August 27, 2025

      Navigating the Complex Landscape of Finance and Fintech Marketing

      August 27, 2025
    • Legal & Compliance

      Exploring Thought Leadership’s Impact on Legal Marketing

      August 27, 2025

      Maximizing LinkedIn: Strategies for Legal and Compliance Marketing

      August 27, 2025

      Why Transparency Matters in Legal Advertising Practices

      August 27, 2025
    • Medical Marketing

      Enhancing Online Reputation Management in Hospitals: A Guide

      August 27, 2025

      Analyzing Emerging Trends in Health and Medical Marketing

      August 27, 2025

      Exploring Innovative Content Ideas for Wellness Blogs and Clinics

      August 27, 2025
    • E-commerce & Retail

      Strategic Seasonal Campaign Concepts for Online and Retail Markets

      August 27, 2025

      Emerging Trends in E-commerce and Retail Marketing Strategies

      August 27, 2025

      Maximizing Revenue: The Advantages of Affiliate Marketing for E-Commerce

      August 27, 2025
    • Influencer & Community

      Leveraging Influencers: Key Drivers in New Product Launches

      August 27, 2025

      Top Influencer Marketing Platforms to Explore in 2025

      August 27, 2025

      Key Strategies for Successful Influencer Partnership Negotiations

      August 27, 2025
    • Content & Leadership

      The Impact of Social Proof on Thought Leadership Marketing

      August 27, 2025

      Balancing Value-Driven Content and Promotional Messaging Strategies

      August 27, 2025

      Analyzing Storytelling’s Impact on Content Marketing Effectiveness

      August 27, 2025
    • SEO & Analytics

      Scaling Success: Monitoring Indexation of Programmatic SEO Content

      August 27, 2025

      Strategies to Mitigate Duplicate Content in Programmatic SEO

      August 27, 2025

      Effective Data Visualization Techniques for SEO Reporting

      August 27, 2025
    • Marketing Trends

      How Privacy-First Marketing Will Transform the Industry Landscape

      August 27, 2025

      Emerging Trends in Marketing Automation and AI Tools for 2023

      August 27, 2025

      Maximizing ROI: Key Trends in Paid Social Advertising

      August 27, 2025
    Soshace Digital Blog
    Blog / Programming / 23. Уроки Node.js. Домены, “асинхронный try..catch”. Часть 2.
    Programming

    23. Уроки Node.js. Домены, “асинхронный try..catch”. Часть 2.

    bragin_paBy bragin_paNovember 16, 2016Updated:May 26, 2024No Comments5 Mins Read
    Facebook Twitter Pinterest Telegram LinkedIn Tumblr Email Reddit
    23. Уроки Node.js. Домены, “асинхронный try..catch”. Часть 2.
    Share
    Facebook Twitter LinkedIn Pinterest Email Copy Link

    node23_2

    Продолжаем наш урок. Давайте немного усложним этот пример, добавив работу с файлами вот таким образом:

    var domain = require('domain');
    var fs = require('fs');
    var d = domain.create(), server;
    
    d.on('error', function(err) {
        console.error("Domain has caught %s", err);
    });
    
    
    d.run(function() {
    
        setTimeout(function() {
          fs.readFile(__filename, function() {
              ERROR();
          });
            }, 1000);
    
    });

    Запускаем. Как ни странно, оно все еще работает. Почему? Как домен из данной функции перекочевал в fs.readFile(__filename, function()? Да все оттуда же. Потому что внутренняя реализация функции readFile знает про домены. Когда она запускает callback, то она запускает его в контексте того же домена. Благодаря этому все хорошо.

    Рассмотрим последний пример.  Создаем новый объект:

    server = new http.Server();

    всю эту логику, которая генерирует ошибку, поместим внутрь обработчика события:

    server.on('boom', function() {
        setTimeout(function() {
            fs.readFile(__filename, function() {
                ERROR();
            });
        }, 1000);
    });

    И для того, чтобы еще больше все запутать, вынесем этот код вниз. То есть, мы создаем объект в одном месте, а ошибка будет вообще после того, как запуск в домене закончился. Обработает ли ее домен? Запускаем наш код, полностью он выглядит вот так:

    var domain = require('domain');
    var fs = require('fs'), http = require('http');
    
    var d = domain.create(), server;
    
    d.on('error', function(err) {
        console.error("Domain has caught %s", err);
    });
    
    d.run(function() {
    
        server = new http.Server();
    
    });
    
    server.on('boom', function() {
        setTimeout(function() {
            fs.readFile(__filename, function() {
                ERROR();
            });
        }, 1000);
    });
    
    server.emit('boom');

    Как видим, все отлично обработалось. Каким образом эта функция узнала про домен? Все благодаря интеграции. Ведь сервер – это EventEmitter. Этот модуль знает про домены, и, когда создается любой EventEmitter, если есть текущий активный домен, то он получает ссылку на него, где ее можно вывести. добавим console.log:

    server = new http.Server();  
    console.log(server.domain); 
    

    Запускаем. Все, есть. После того, как EventEmitter привязан к домену, любые обработчики он запускает именно в контексте этого домена. Конечно же, если сервер создается вне активного домена, то ни о каком server.domain не может идти и речи. Впрочем, с такими объектами тоже можно иметь дело, необходимо лишь добавить их домен вручную: специальный вызов add:

    server = new http.Server();
    
    d.run(function() {
    
        d.add(server);
    
        console.log(server.domain);
    
    });

    Если мы сейчас это вызовем, то все будет хорошо, ошибка перехвачена. Единственная тонкость, которую здесь надо иметь в  виду, это управление памятью. Дело в том, что если EventEmitter создан именно в контексте домена, то он получает ссылку, в данном случае server.domain. А если он был создан ранее и добавлен через add, то он получает не только сам ссылку на этот домен, но еще и домен ссылается на него. То есть, у домена есть специальный массив members, где он ссылается на все, что ссылается через  add. Во всяком случае, такова текущая реализация. Соответственно, получается, что с add мы имеем двустороннюю ссылку server ↔domain. В результате получается, что память может быть очищена не от сервера в отдельности, не от домена в отдельности, а от них обоих вместе. То есть, если есть какой-то долго живущий домен, и к нему через add  прибавляется много всего, то память не будет очищена, пока домен не умрет, либо пока когда это станет возможным, не будет вызов d.remove(server). Как правило, в скриптах эти штуки используют редко, обычно стараются создавать все, что нужно, внутри домена, и таких проблем не возникает.

    Read More:  6. Уроки Node.js. Util и Наследование

    Вернемся к примеру, который рассматривали в первой части статьи, то есть, к серверу. Перейдите на commit под названием domain_1-11:

    Как вы считаете, в чем же дело? Почему ошибка в обработчике запроса вылетела и не была обработана доменом? Как это поправить? Дело в том, что сервер создан вне домена. Таким образом, handler – это обработчик события request. Так как сервер создан вне домена, то при вызове обработчика никакой домен ему не передается, и throw, как и раньше, валит весь процесс. Чтобы все было хорошо, достаточно взять этот объект server и создать его внутри вызова run:

    serverDomain.run(function() {  
      var server = require('./server');  
      server.listen(3000);  
    });
    

    Вот так будет все нормально, поскольку сервер привязан к домену. Проверим. Запускаем код. Вызываем Chrome и переходим по тому же url:

    http://127.0.0.1:3000/

    Теперь домен перехватил ошибку, ничего не упало. С другой стороны, конечно же, задача не может считаться полноценно решенной, потому что нужно что-то ответить посетителю: “извините, ошибка, приходите к нам потом”.

    А как нам ответить? Здесьserver.domain перехватил ошибку, но никакой информации о том, где она, у него нет. Для того, чтобы ее получить, мы будем создавать домен отдельно для каждого запроса. Выглядит это следующим образом. Есть два файла. Первый  app.js – главный, основной файл приложения:

    var domain = require('domain');
    var serverDomain = domain.create();
    
    var server;
    
    serverDomain.on('error', function(err) {
       console.error("Server error", err);
       if (server) server.close();
    
       setTimeout(function () {
           process.exit(1);
       }, 1000).unref();
    });
    
    
    serverDomain.run(function() {
        var http = require('http');
        var handler = require('./handler');
        //var database = require ('mongodb');
    
         server = http.createServer (function(req, res) {
    
           var reqDomain = domain.create();
            reqDomain.add(req);
            reqDomain.add(res);
    
            reqDomain.on('error', function(err) {
              res.statusCode = 500;
              res.end("Sorry, " + err);
               // ...
              serverDomain.emit('error', err);
            });
    
            reqDomain.run(function() {
               handler(req, res);
             });
           });
    
         server.listen(3000);
    });

    Он занимается тем, что запускает сервер, создает домены. Второй – handler.js, модуль, который занимается обработкой запросов:

    var fs = require('fs');
    
    module.exports = function handler(req, res) {
        if (req.url == '/') {
    
            fs.readFile('no-such-file', function(err, content) {
    
                if (err) throw err; // JSON.parse("invalid!")
    
                res.end(content);
            });
    
        } else {
            res.statusCode = 404;
            res.end("Not Found");
        }
    
    };

    Итак, из чего состоит app.js?

    Мы поговорим об этом в следующей статье. До скорых встреч. Код нашего урока можно найти здесь.

    Read More:  23. Уроки Node.js. Домены, "асинхронный try..catch". Часть 1.

    to-be-continued-series-8

    Материалы для статьи взяты из следующего скринкаста.

    We are looking forward to meeting you on our website blog.soshace.com

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    bragin_pa

      Related Posts

      3. Уроки Express.js. Шаблонизация с EJS: Layout, Block, Partials

      December 16, 2016

      Уроки Express.js . Логгер, Конфигурация, Шаблонизация с EJS. Часть 2.

      December 2, 2016

      2. Уроки Express.js . Логгер, Конфигурация, Шаблонизация с EJS. Часть 1.

      November 24, 2016
      Leave A Reply Cancel Reply

      You must be logged in to post a comment.

      Stay In Touch
      • Facebook
      • Twitter
      • Pinterest
      • Instagram
      • YouTube
      • Vimeo
      Don't Miss
      Entrepreneurship August 3, 2019

      Tim Burgess: The Future of Work Will Revolve Heavily Around Flexibility

      I talked to Tim Burgess, the Director of Shield GEO Services Limited, a Global Employer Organization (GEO), an expert in outsourced employment and international remote work.

      How to pay your foreign remote workers?

      October 9, 2018

      TOP 6 Coding Interview Tools for Screening & Testing Web Developers

      February 22, 2019

      Essential Skill of Capabilities Assessment

      May 8, 2019

      Categories

      • AI & Automation
      • Angular
      • ASP.NET
      • AWS
      • B2B Leads
      • Beginners
      • Blogs
      • Business Growth
      • Case Studies
      • Comics
      • Consultation
      • Content & Leadership
      • CSS
      • Development
      • Django
      • E-commerce & Retail
      • Entrepreneurs
      • Entrepreneurship
      • Events
      • Express.js
      • Facebook Ads
      • Finance & Fintech
      • Flask
      • Flutter
      • Franchising
      • Funnel Strategy
      • Git
      • GraphQL
      • Home Services Marketing
      • Influencer & Community
      • Interview
      • Java
      • Java Spring
      • JavaScript
      • Job
      • Laravel
      • Lead Generation
      • Legal & Compliance
      • LinkedIn
      • Machine Learning
      • Marketing Trends
      • Medical Marketing
      • MSP Lead Generation
      • MSP Marketing
      • NestJS
      • Next.js
      • Node.js
      • Node.js Lessons
      • Paid Advertising
      • PHP
      • Podcasts
      • POS Tutorial
      • Programming
      • Programming
      • Python
      • React
      • React Lessons
      • React Native
      • React Native Lessons
      • Recruitment
      • Remote Job
      • SaaS & Tech
      • SEO & Analytics
      • Soshace
      • Startups
      • Swarm Intelligence
      • Tips
      • Trends
      • Vue
      • Wiki
      • WordPress
      Top Posts

      5 Best JavaScript Conferences to Attend in 2019

      Events June 15, 2019

      Getting started with Next.js

      JavaScript November 16, 2020

      Enhancing Recruitment: The Crucial Role of Diversity and Inclusion

      Recruitment December 16, 2024

      Build Real-World React Native App #4 : Content Placeholder

      React Native November 27, 2020

      Subscribe to Updates

      Get The Latest News, Updates, And Amazing Offers

      About Us
      About Us

      Soshace Digital delivers comprehensive web design and development solutions tailored to your business objectives. Your website will be meticulously designed and developed by our team of seasoned professionals, who combine creative expertise with technical excellence to transform your vision into a high-impact, user-centric digital experience that elevates your brand and drives measurable results.

      7901 4th St N, Suite 28690
      Saint Petersburg, FL 33702-4305
      Phone: 1(877)SOSHACE

      Facebook X (Twitter) Instagram Pinterest YouTube LinkedIn
      Our Picks
      Beginners

      Technical Writing: Practical & Theoretical Advice

      Entrepreneurship

      Essential Steps to Craft a Winning Startup Business Model

      Startups

      Effective Strategies to Secure Funding for Your Startup

      Most Popular

      Java Stream API

      Beginners

      JavaScript / Node.js Tools

      Programming

      Best Background Check Services Assessments

      Consultation
      © 2025 Soshace Digital.
      • Home
      • About
      • Services
      • Contact Us
      • Privacy Policy
      • Terms & Conditions

      Type above and press Enter to search. Press Esc to cancel.