脚本不断下降

时间:2018-03-26 22:36:24

标签: javascript node.js

有一个代码。它的逻辑首先是从客户端(uploadFile)获取文件,然后将其加载到另一个服务器(changeImage),然后加载答案(loadFile)。所有这一切都完成了将它们联系在一起的承诺,但它并没有起作用。它不断下降黎明。我试图改变它很多。其实我花了整整一天的时间。但没有结果。在这个版本中,它在控制台中没有任何错误。你能救我吗?

<pre>
var fs = require('fs'),
  http = require('http'),
  url = require('url'),
  multiparty = require('multiparty'),
  request = require('request');

var server = new http.Server();

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];
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(a) {
          return 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) {
          //it falls before here because console.log('H') here won't show 'H' :-|
          loadFile(link);
        })
        .then(function() {
          return changeImage({
              'uploadfile': fs.createReadStream('./files/temp.jpg'),
              'efset1': 2,
              'outformat': 2,
              'jpegtype': 1,
              'jpegqual': 85,
              'jpegmeta': 1
            },
            'https://www.imgonline.com.ua/add-effect-black-white-result.php', '',
            new RegExp(/https:\/\/.+?\.jpg/)
          );
        })
        .then(function(link) {
          loadFile(link);
        })
        .then(function() {
          res.end('files/temp.jpg');
        })
        .catch(function(err) {
          console.log('ERR ', err);
        });
      break;
    default:
      fs.readFile('./' + req.url, function(err, file) {
        if (err) res.end();
        res.end(file);
      });
  }
}

function uploadFile(req) {
  if (fs.existsSync('./files/temp.jpg')) {
    fs.unlink('./files/temp.jpg', function(err) {
      if (err) reject(err);
    });
  }
  return new Promise(function(resolve, reject) {
    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(err) {
        if (err) reject('ERRinCOPYING');
        fs.unlink(path, function(err) {
          if (err) reject(err);
          var a = 0;
          var timer = setInterval(function() {
            if (fs.existsSync('./files/temp.jpg')) {
              clearInterval(timer);
              resolve();
            }
          }, 10);
        });
      });
    });
  });
}

function changeImage(formData, url, link, regExp) {
  return new Promise(function(resolve, reject) {
    request.post({
      url: url,
      formData: formData
    }, function(err, resp, body) {
      if (err) reject('ERRinREQUEST: ' + err);
      link += body.match(regExp);
      if (link.length > 32) {
        resolve(link);
      } else {
        reject('ERROR! LINK WAS NOT FOUND');
      }
    });
  });
}

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

问题是如果我评论uploadFile()并运行脚本的其余部分然后一切正常,相反如果我评论脚本的其余部分并且只留下uploadFile()取消注释然后一切正常。 控制台没有显示。就在客户端,我看到拒绝连接。但是在控制台中什么都没有如果我把console.log()放在&#39;返回新的Promise()&#39;在changeImage中它将不显示任何内容

UPD:我用&#34;节点服务器运行脚本&#34;不像往常那样使用&#34;主管服务器&#34;它开始没有失败地工作。但为什么? :\

1 个答案:

答案 0 :(得分:0)

您可能遇到了文件系统权限问题。当您提到时通过node server运行脚本时,该进程没有您通过supervisor server执行时拥有的权限。