Formidable и Node.js TypeError: Не може да се прочете свойството „path“ на undefined

Ако четете това, вероятно следвате урока Node на Manuel Kiessling. Получавах следната грешка, когато завършвах частта за качване на файл от урока.

fs.rename(files.upload.path, "img/img.jpg", function(error) {
                              ^
TypeError: Cannot read property 'path' of undefined

Търсих наоколо, намерих това и това, но те бяха доста неубедителни и предоставиха малко помощ.


person Jamie Counsell    schedule 09.03.2015    source източник


Отговори (4)


Първо, вярно е, че урокът предава заявка и отговор в грешен ред. Първото нещо, което направих, е да променя реда от (response, request) на (request, response). (Уверете се, че правите това навсякъде). Причината за това е, че съм почти сигурен, че функцията onRequest в createServer() на HTTP ги предава в този ред.

След като го направих, все още получавам същата грешка. Но като регистрирам информацията, идваща от моя формуляр

...
var form = new formidable.IncomingForm();
console.log("About to parse...");
form.parse(request, function(error, fields, files) {

    console.log("Parsing done.");
    console.dir(request.headers);
    console.log(fields);
    console.log(files);
...

Забелязах, че ключът fields съдържа това, което търсех, а ключът files беше празен.

{ upload: '2015-03-08 14.54.06.jpg', 'Upload File': 'Submit' }
{}

От тук става ясно, че мога да използвам fields.upload. Използването на това върна друга грешка, че не е низ (или поне не такъв, който страхотният би приел). toString() изглежда също не работи, така че използвах алтернативното преобразуване:

fs.rename(fields.upload + "", "img/img.jpg", function(error) {
    ...
}

Което не е идеално, но свърши работа.

Това беше направено с [email protected] и [email protected]. Не знам дали моето решение ще работи за всички, но се надявам, че може да насочи някои от вас в правилната посока. Несъответствието вероятно се дължи на факта, че той е използвал по-стари версии на node и formidable в урока.

person Jamie Counsell    schedule 09.03.2015

Получавах същия проблем и се борих много, само за да открия, че съм направил печатна грешка.

Какво бях въвел:

res.write('<form action="fileupload" method="post" enctype="multipart/formdata">');

Какво трябваше да бъде:

res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');

Забележете липсващото - в form-data.

person Christine George    schedule 29.10.2018

Имах същия проблем, със същия урок. Оказа се, че имам правописна грешка във функцията start() на requestHandlers, която отпечатва HTML формуляра. имах

'<form action="/upload" enctype="multipart/form-date" ' +

когато трябваше да бъде

'<form action="/upload" enctype="multipart/form-data" ' +

(променено "дата" на "данни"). Поправянето на този единствен проблем го накара да работи за мен.

Така че, разгледайте много внимателно данните на HTML формуляра във вашата функция start() на requestHandlers и вижте дали има правописни грешки, които пречат на правилното качване на файла.

person Chad    schedule 16.09.2015

Имах същата грешка, защото името на полето за въвеждане беше различно, тъй като fs.rename се опитваше да използва.

По принцип се уверете, че името в този ред:

'<input type="file" name="UPLOADEDIMAGE">'+

Същото е като тези 2 реда:

fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png", function(err) {

fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png");
person Carlos Lugo    schedule 30.12.2016