Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2018, 18:19
Интересующийся
Отправить личное сообщение для dfcz112 Посмотреть профиль Найти все сообщения от dfcz112
 
Регистрация: 30.01.2018
Сообщений: 29

Падает непонятно почему
Вот эта долбаная простыня падает. До этого работало всё нормально, делал изменения, но всё возвращал на место. В какой-то момент перестало работать. Ajax с клиента завершается с ошибкой. Методом тыка выяснил, что падает где-то на функции changeImage()
var fs = require('fs'),
  http = require('http'),
  url = require('url'),
  multiparty = require('multiparty'),
  request = require('request');

var server = new http.Server();

//получить локальный ip на который нужно подключаться
var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
  .map(x => [x, ifs[x].filter(x => x.family === 'IPv4')[0]])
  .filter(x => x[1])
  .map(x => x[1].address)[2]; // [2] - номер в списке
console.log('\nUse this ip: ' + result);
console.log("Successfully started\n");

server.listen('80', result);
server.on('request', onRequest);

function onRequest(req, res) {
  var parsed = url.parse(req.url, true);
  switch (parsed.pathname) {
    case '/':
    case '/index.html':
      fs.readFile('index.html', function(err, file) {
        if (err) res.end();
        res.end(file);
      });
      break;
    case '/file':
      uploadFile(req)
        .then(
          function() {
            changeImage({
                'uploadfile': fs.createReadStream('./files/temp.jpg'),
                'ef-set': 10,
                'ef-set-2': 10,
                'jpeg-quality': 80
              }, 'https://www.imgonline.com.ua/grid-square-result.php',
              'http://www.imgonline.com.ua/',
              new RegExp(/download\.php\?file=.+?\.jpg/))
          })
        .then(function(link) {
          loadFile(link)
        })
        .then(function() {
          res.end('files/temp.jpg')
        });
      break;
    default:
      fs.readFile('./' + req.url, function(err, file) {
        if (err) res.end();
        res.end(file);
      });
  }
}

function uploadFile(req) {
  if (fs.exists('./files/temp.jpg')) {
    fs.unlink('./files/temp.jpg', function() {});
  }

  return new Promise(function(resolve, reject) {
    var form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
      if (err) reject();

      var path = files.uploadfile[0].path;

      fs.copyFile(path, './files/temp.jpg', function() {
        fs.unlink(path, function(err) {
          if (err) reject();
          resolve();
        });
      });
    });
  });
}

function changeImage(formData, url, link, regExp) {
  request.post(
    {
      url: url,
      formData: formData
    },
     function(err, resp, body) {
    if (err) {
      console.log('ERR: ', err);
    }
    console.log(body);
    link += body.match(regExp);
    return link;
  });
}

function loadFile(link) {
  request
    .get(link)
    .on('response', function(response) {})
    .pipe(fs.createWriteStream('./files/temp.jpg'))
    .on('finish', function() {});
  return;
}

Вот ошибка с которой всё падает:
(node:17860) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: options.uri is a required argument
(node:17860) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
crashing child
Ответить с цитированием
  #2 (permalink)  
Старый 25.03.2018, 19:31
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Функция uploadFile зачем возвращает промис, если в его resolve ничего не передаётся? - это я не понял.
А функция changeImage переменную link из колбека request, конечно, не возвращает - в ней без промиса никак не обойтись.
Ответить с цитированием
  #3 (permalink)  
Старый 25.03.2018, 20:03
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Я бы так попробовал чиста для интереса.
async function onRequest(req, res) {
  var parsed = url.parse(req.url, true);
  switch (parsed.pathname) {
    case '/':
    case '/index.html':
      fs.readFile('index.html', function(err, file) {
        if (err) res.end();
        res.end(file);
      });
      break;
    case '/file':
      await uploadFile(req);
      var l = await changeImage({
                'uploadfile': fs.createReadStream('./files/temp.jpg'),
                'ef-set': 10,
                'ef-set-2': 10,
                'jpeg-quality': 80
              }, 'https://www.imgonline.com.ua/grid-square-result.php',
              'http://www.imgonline.com.ua/',
              new RegExp(/download\.php\?file=.+?\.jpg/));
      await loadFile(l);
      res.end('files/temp.jpg')
      break;
    default:
      fs.readFile('./' + req.url, function(err, file) {
        if (err) res.end();
        res.end(file);
      });
  }
}

function changeImage(formData, url, link, regExp) {
  return new Promise( (resolve, reject) => {
    request.post(
      {
        url: url,
        formData: formData
      },
       function(err, resp, body) {
      if (err) {
        console.log('ERR: ', err);
      }
      console.log(body);
      link += body.match(regExp);
      resolve(link);
    });
  });
}

Я вот не знаю, можно ли тут запилить async-функцию в качестве хендлера? Не пробовал.
Теоретически - а почему нет?

Последний раз редактировалось Audaxviator, 25.03.2018 в 20:20.
Ответить с цитированием
  #4 (permalink)  
Старый 25.03.2018, 20:35
Интересующийся
Отправить личное сообщение для dfcz112 Посмотреть профиль Найти все сообщения от dfcz112
 
Регистрация: 30.01.2018
Сообщений: 29

С промисами я пока так себе дружу. uploadFile возвращает промис, чтобы остальную цепочку причейнить к ней.
Изменил changeImage на это
function changeImage(formData, url, link, regExp) {
  return new Promise(function(resolve, reject){
    request.post(
      {
        url: url,
        formData: formData
      },
       function(err, resp, body) {
      if (err) {
        console.log('ERR: ', err);
      }
      console.log(body);
      link += body.match(regExp);
      resolve(link);
    });
  })
}

Результат тот же. Я в бешенстве .\/.
Ответить с цитированием
  #5 (permalink)  
Старый 25.03.2018, 20:36
Интересующийся
Отправить личное сообщение для dfcz112 Посмотреть профиль Найти все сообщения от dfcz112
 
Регистрация: 30.01.2018
Сообщений: 29

В awaita'х я пока не секу
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2018, 20:37
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Что значит сменил changeImage? смысл?
Надо всё менять, чего я написал.
Ну и вот так
function uploadFile(req) {
  if (fs.exists('./files/temp.jpg')) {
    fs.unlink('./files/temp.jpg', function() {});
  }

  var form = new multiparty.Form();
  form.parse(req, function(err, fields, files) {

    var path = files.uploadfile[0].path;
 
    fs.copyFile(path, './files/temp.jpg', function() {
      fs.unlink(path, function(err) {
        if (err) console.log(err);
      });
    });
  });
}

Последний раз редактировалось Audaxviator, 25.03.2018 в 20:48.
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2018, 21:26
Интересующийся
Отправить личное сообщение для dfcz112 Посмотреть профиль Найти все сообщения от dfcz112
 
Регистрация: 30.01.2018
Сообщений: 29

Усё. Работает. Спасибо добрый человек. Заодно и asyncами немного подразобрался. Представление получил
Ответить с цитированием
  #8 (permalink)  
Старый 25.03.2018, 21:41
Интересующийся
Отправить личное сообщение для dfcz112 Посмотреть профиль Найти все сообщения от dfcz112
 
Регистрация: 30.01.2018
Сообщений: 29

а loadFile с промисом делать не надо? Всё-таки операция тоже требует времени, а changeImage и loadFile по коду вызываются дважды
Ответить с цитированием
  #9 (permalink)  
Старый 25.03.2018, 21:53
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Промис в нём никакой функции не несёт. Ну, не мешает, но зачем?
Я не понял, чего где два раза вызывается? Ни надо два раза.
Ответить с цитированием
  #10 (permalink)  
Старый 25.03.2018, 21:55
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Ну и парсить url - это лишнее в данном случае
switch (req.url)...

и всё.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему некоторые операторы возвращают значения, а не ссылки? dump Общие вопросы Javascript 15 25.07.2012 17:28
Регулярные выражения. Почему находи именно так? jsuse Общие вопросы Javascript 4 21.11.2011 16:37
Свойства объекта, методы и this. Почему свойство вызывается с () ? jsuse Общие вопросы Javascript 2 04.11.2011 20:39
Prototype. Одноблочное определение псевдокласса. Литеральная форма не робит. Почему? GuardCat Общие вопросы Javascript 6 03.10.2011 13:46
Имитация селектов: огромный отступ непонятно откуда exec jQuery 0 23.06.2010 21:20