Ответы пользователя по тегу Node.js
  • Хотелось бы узнать мнение болле опытных разработчиков?

    @holllop Автор вопроса
    На данный момент переделал функции
    function createValuesTemplate(length) {
      const numColumns = 9; 
      const placeholders = [];
      let placeholderIndex = 1; 
    
      for (let i = 0; i < length; i++) {
        let rowPlaceholders = [];
        for (let j = 0; j < numColumns; j++) {
          rowPlaceholders.push('$' + placeholderIndex++);
        }
        placeholders.push('(' + rowPlaceholders.join(', ') + ')');
      }
    
      return placeholders.join(', ');
    }
    
    async function accepting_expenses_array(req, res) {
      const expenses_array = req.body;
      const expenses_as_numbers = expenses_array.map(Number);
      console.log("expenses_as_numbers",expenses_as_numbers)
      try {
        // Первое число - id_order. Ищем максимальный id_work
        const results = await pool.query('SELECT id_work FROM "works" WHERE id_order = $1', [expenses_as_numbers[0]]);
        
        const work_id_array = results.rows.map(row => row.id_work);
        const work_id_max = Math.max(...work_id_array);
        console.log("work_id_max",work_id_max)
    
        const expensesWithoutFirst = expenses_as_numbers.slice(1); // Игнорируем первый элемент, id_order
    
        const newExpensesArray = [];
        for (let i = 0; i < expensesWithoutFirst.length; i += 8) {
          // Добавляем work_id_max в начало каждой строки значений
          newExpensesArray.push(work_id_max, ...expensesWithoutFirst.slice(i, i + 8));
        }
        console.log("newExpensesArray",newExpensesArray)
        if (newExpensesArray.length % 9 !== 0) {
          return res.status(400).json({
            success: false,
            error: 'Количество элементов в массиве расходов должно быть кратным числу столбцов таблицы (включая work_id_max).'
          });
        }
        
        // Подготовка SQL запроса на вставку
        const insertQuery = `INSERT INTO "expenses" (
          n_plan, 
          type_work_id, 
          printer_id, 
          material_id,
          format_id, 
          performer_id, 
          n_sheets, 
          n_page, 
          n_ruined
        ) VALUES ${createValuesTemplate(newExpensesArray.length / 9)};;`
    
        console.log("createValuesTemplate(newExpensesArray.length / 9)",createValuesTemplate(newExpensesArray.length / 9))
    
        // Выполняем запрос на вставку с newExpensesArray
        const insertResult = await pool.query(insertQuery, newExpensesArray);
        console.log("insertResult",insertResult);
        // Отправляем успешный ответ
        return res.json({ success: true, message: 'Данные успешно добавлены.' });
      } catch (error) {
        // Логирование ошибки и отправка ошибочного ответа
        console.error('Error during query execution:', error.stack);
        return res.status(500).json({
          success: false,
          error: error.message
        });
      }
    }

    выяснил что пакетная вставка быстрее
    Добил до конца, то что хотел. Работает как задумано
    Ответ написан
    Комментировать
  • Ошибка при запуске проекта на node js?

    @holllop
    Судя по всему в вашем файле app.js на 23 строке ошибка. Да и предоставьте код того, что вы пытаетесь запустить на Node. А то так сложно сказать что не так.
    Ответ написан
    Комментировать
  • Как обеспечить возможность одновременного вызова эндпойнта, пишущего в БД?

    @holllop
    Попытаюсь ответить как-то комплексно.
    Дедлоки в базе данных могут быть вызваны различными причинами, такими как конфликты параллельных транзакций, блокировки на ресурсы и другие. В вашем случае, если у вас возникают дедлоки при одновременных запросах, использование транзакций может помочь, но вам также необходимо управлять блокировками и избегать конфликтов. То есть воспользоваться блокировкой на уровне строки (Row Locking) и блокировкой на уровне транзакции (Transaction Locking) это всё механизмы Sequelize. Вполне возможно, что даже при использовании этих механизмов могут остаться дедлоки. И в таком случае использование Redis будет необходимо.
    Ответ написан
    2 комментария
  • Как добавить сайт в nginx с помощью node js?

    @holllop
    Я бы рекомендовал сразу на Node.js поставить модуль fs в вашем вопросе не как без него.
    Например
    1. Добавить новые конфигурации сайта в общий файл nginx conf.
    можно примерно таким образом.
    const fs = require('fs');
    const path = require('path');
    
    const nginxConfPath = '/etc/nginx/nginx.conf'; // путь к вашему файлу nginx.conf
    
    // Чтение содержимого nginx.conf
    const nginxConfContent = fs.readFileSync(nginxConfPath, 'utf8');
    
    // Дополнение новыми настройками
    const newConfig = 
        server {
            listen 80;
            server_name example.com;
            location / {
                root /path/to/new/website;
                index index.html;
            }
        }
    ;
    
    const updatedNginxConfContent = nginxConfContent + newConfig;
    
    // Запись измененного содержимого обратно в файл nginx.conf
    fs.writeFileSync(nginxConfPath, updatedNginxConfContent, 'utf8');

    2. Создать папку сайта.

    const newWebsitePath = '/path/to/new/website'; // путь к новой папке сайта
    
    // Создание папки
    fs.mkdirSync(newWebsitePath);

    в остальном не очень уверен по этому наверное лучше не буду писать )
    Ответ написан
    2 комментария
  • SyntaxError: Unexpected token 'P', "POST-запро"... is not valid JSON, как исправить эту ошибку?

    @holllop Автор вопроса
    у меня ошибка. я не правильно обрабатывал на сервере. Спасибо Михаил Р., он помог обнаружить ошибку.
    Ответ написан
    Комментировать
  • Для чего нужен nodejs?

    @holllop
    Попробую ответить по порядку.
    Node.js является средой выполнения JavaScript, которая работает за пределами браузера, на сервере. Он позволяет разрабатывать серверный код для веб-страниц и веб-приложений. В контексте веб-сервера, Node.js предоставляет возможность создания и запуска сервера, который будет обрабатывать HTTP-запросы и отвечать на них.
    Всё это слишком абстрактно, сложно материализующее в голове понятия... Скажем, есть к примеру хост-провайдер, предоставляющие место для сайта. Он же использует тот же http запрос для отдачи нам нужных файлов? Или взять к примеру php... Про него не говорят, что с его помощью нужно создать веб-сервер?

    Хост-провайдер или хостинг-провайдер - это компания, которая предоставляет услуги хостинга, т.е. предоставляет место на своих серверах для размещения сайтов. Когда вы загружаете веб-страницы на хостинг-провайдер, он использует веб-серверное ПО (например, Node.js, Apache, Nginx) для обработки входящих запросов от клиентов и отдачи файлов, которые запрошены браузерами пользователей.
    что такое веб сервер?

    веб-сервер (например, на базе Node.js или PHP) - это программное обеспечение, которое обрабатывает HTTP-запросы, предоставляет веб-содержимое и выполняет необходимые операции для функционирования веб-приложений. Node.js предлагает возможности для разработки серверного кода на JavaScript, в то время как PHP является отдельным языком программирования со своими инструментами и функциональностью.
    Ответ написан
    Комментировать
  • Как правильно сделать сложный запрос к БД, через Node.js?

    @holllop Автор вопроса
    Прежде чем ответить, хочу поблагодарить kosuha. Ты мне очень помог реально. Как оказалось мне не нужна сложная структура типа GET запрос зависящий от POST запроса(из-за чего у меня и возникала ошибка
    TypeError: Converting circular structure to JSON
        --> starting at object with constructor 'Socket'
        |     property 'parser' -> object with constructor 'HTTPParser'
        --- property 'socket' closes the circle
    )
    дальше я приведу как я решил свою проблему
    клиент-код
    function loadSelectOptions2(url, selectElement) {
      fetch(url)
        .then(response => response.json())
        .then(data => {
          data.forEach(item => {
            const option = createOption(item.printer_id, item.material);
            selectElement.appendChild(option);
          });
        })
        .catch(error => {
          console.error(error);
          // Обработать ошибку
        });
    }
    selectElement2.addEventListener('change', () => {
        const selectedPrinterId = selectElement2.value;
        console.log('selectedPrinterId:', selectedPrinterId);
        // Очистить select3 перед загрузкой новых опций
        selectElement3.innerHTML = '';
        // Загрузить опции для select3 на основе выбранного значения select2
        if (selectedPrinterId) {
          const url = `http://:3000/printer_material?printer_id=${encodeURIComponent(selectedPrinterId)}`;
          loadSelectOptions2(url, selectElement3);
        }
      });

    код сервера
    const http = require('http');
    const express = require('express');
    const bodyParser = require('body-parser');
    const cors = require('cors');
    const db = require('./pool');
    
    const app = express();
    const port = 3000;
    
    app.use(bodyParser.json());
    app.use(
      bodyParser.urlencoded({
        extended: true,
      })
    );
    app.use(cors());
    app.get('/printer_material', (req, res) => {
      const printer_id = parseInt(req.query.printer_id, 10);
    
      console.log('Received printer_id:', printer_id); // Вывод значения в консоль как число
    
      db.getPrinter_material(printer_id, res);
    });
    http.createServer(app).listen(port, () => {
      console.log(`App running on port ${port}.`);
    });

    //pool.js
    const { response } = require('express');
    
    const Pool = require('pg').Pool;
    const pool = new Pool({
      user: '',
      host: '',
      database: '',
      password: '',
      port: 5432,
    });
    
    const getPrinter_material = (printer_id, response) => {
      console.log('Received printer_id:', printer_id); 
    
      pool.connect((error, client, release) => {
        if (error) {
          throw error;
        }
    
        const query = {
          text: `SELECT pr.printer_id, m.material FROM printer_material pm JOIN printer pr ON pm.printer_id = pr.printer_id JOIN material m ON pm.material_id = m.material_id WHERE pr.printer_id = $1`,
          values: [printer_id],
        };
    
        console.log('Query text:', query.text);
    
        client.query(query, (error, results) => {
          release();
    
          if (error) {
            throw error;
          }
    
          console.log(results.rows);
          response.json(results.rows);
        });
      });
    };
    module.exports = {
      getPrinter_material,
    };

    Я не убирал множественные console.log пока они остались так как я часть за частью проверял работоспособность кода
    Ответ написан
    Комментировать
  • Как работает backend на примере стеков graphQL и Apollo, nodejs, express?

    @holllop
    Давайте по порядку разберем ваши вопросы:
    1) Если у вас есть данные в формате JSON и вы хотите их хранить в базе данных, то самый простой способ - это использовать базу данных, которая поддерживает JSON, например PostgreSQL с расширением JSONB. Вы можете сохранить JSON-данные в столбце с типом данных JSONB и индексировать поля внутри JSON для быстрого доступа к данным. Также можно использовать ORM (Object-Relational Mapping), такой как Sequelize или TypeORM, для работы с JSON в базе данных.
    2) GraphQL - это язык запросов и спецификация, которая позволяет клиентским приложениям запрашивать только необходимые данные с сервера. Однако, GraphQL также может использоваться в качестве API-сервера, который обрабатывает запросы от клиентов, возвращает запрошенные данные или выполняет мутации для изменения данных. Таким образом, GraphQL может использоваться как язык запросов, так и как средство создания API.(я сам часто смотрю в сторону Graph))
    3) Apollo - это набор библиотек для работы с GraphQL на клиентской и серверной стороне. Apollo Client - это библиотека для работы с GraphQL на стороне клиента, которая предоставляет инструменты для выполнения запросов к серверу GraphQL и управления данными в приложении. Apollo Server - это библиотека для работы с GraphQL на стороне сервера, которая позволяет создавать GraphQL API и обрабатывает запросы от клиентского приложения. Apollo Server и Apollo Client - это часто используемые инструменты для работы с GraphQL.
    4) API-сервер на основе GraphQL может быть реализован с использованием различных инструментов, таких как GraphQL.js, Apollo Server, Express.js или других. GraphQL сам по себе является спецификацией языка запросов, а Apollo Server и другие инструменты предоставляют реализацию этой спецификации для создания API-сервера. Node.js и Express.js могут использоваться как основа для создания и обработки запросов API-сервера на базе GraphQL.
    5) Apollo Server - это реализация спецификации GraphQL, которая предоставляет инструменты для разработки сервера GraphQL. Он обрабатывает запросы от клиентов, анализирует их и выполняет запросы к базе данных или другим источникам данных. Таким образом, Apollo Server является часто используемым инструментом для создания сервера GraphQL, который предоставляет мощные возможности для работы с GraphQL-схемой и запросами.
    Ответ написан
    Комментировать
  • Какой стек необходим для изучения GraphQL и Apollo?

    @holllop
    Ну смотри. Если ты собираешься изучить работу с GraphQL и Apollo, то нужны хотя бы базовые знания по Node.js, так как Apollo в значительной степени связан с экосистемой Node.js и использует его для создания серверов GraphQL.
    Теперь к основным темам которые желательно знать(список не полный тут только те, что я вспомнил):
    1. Express.js: Express является популярным фреймворком для Node.js, и его знание будет полезным при создании сервера GraphQL с помощью Apollo. Рекомендуется изучить основы Express.js, такие как маршрутизация, обработка запросов и ответов, и middleware.
    2. Работа с базами данных: Apollo и GraphQL часто используются для запросов и манипуляций данных в базах данных. Поэтому полезно знать основы работы с базами данных в Node.js, такие как использование ORM (например, Sequelize или Mongoose), выполнение запросов SQL или MongoDB и работу с моделями данных.
    3. Асинхронное программирование: В GraphQL и Apollo запросы часто выполняются асинхронно. Поэтому знание принципов асинхронного программирования в JavaScript, таких как использование промисов, асинхронных функций и async/await, будет полезным.
    4. REST API: Хорошее понимание понятий и принципов работы с REST API также может быть полезным при изучении GraphQL, так как GraphQL может быть использован как альтернатива REST API. Рекомендуется изучить основы RESTful API и понимание различий между REST и GraphQL.
    Это те что мне первые приходят на ум возможно дополню список
    Ответ написан
    3 комментария