25.03.2018, 18:19
|
Интересующийся
|
|
Регистрация: 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
|
|
25.03.2018, 19:31
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Функция uploadFile зачем возвращает промис, если в его resolve ничего не передаётся? - это я не понял.
А функция changeImage переменную link из колбека request, конечно, не возвращает - в ней без промиса никак не обойтись.
|
|
25.03.2018, 20:03
|
Профессор
|
|
Регистрация: 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.
|
|
25.03.2018, 20:35
|
Интересующийся
|
|
Регистрация: 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);
});
})
}
Результат тот же. Я в бешенстве .\/.
|
|
25.03.2018, 20:36
|
Интересующийся
|
|
Регистрация: 30.01.2018
Сообщений: 29
|
|
В awaita'х я пока не секу
|
|
25.03.2018, 20:37
|
Профессор
|
|
Регистрация: 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.
|
|
25.03.2018, 21:26
|
Интересующийся
|
|
Регистрация: 30.01.2018
Сообщений: 29
|
|
Усё. Работает. Спасибо добрый человек. Заодно и asyncами немного подразобрался. Представление получил
|
|
25.03.2018, 21:41
|
Интересующийся
|
|
Регистрация: 30.01.2018
Сообщений: 29
|
|
а loadFile с промисом делать не надо? Всё-таки операция тоже требует времени, а changeImage и loadFile по коду вызываются дважды
|
|
25.03.2018, 21:53
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Промис в нём никакой функции не несёт. Ну, не мешает, но зачем?
Я не понял, чего где два раза вызывается? Ни надо два раза.
|
|
25.03.2018, 21:55
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Ну и парсить url - это лишнее в данном случае
switch (req.url)...
и всё.
|
|
|
|