2017-10-16 12 views
0

Avoir quelques erreurs bizarres avec mon serveur nodejs que je ne rencontrais pas auparavant. Je reçois l'erreur: "TypeError: Impossible de lire la propriété 'length' de undefined" J'utilise formidable pour traiter toutes les données de formulaire de ma page html. J'ai essayé beaucoup de choses pour le réparer, et j'ai regardé en ligne pour les personnes ayant des problèmes similaires mais sans aucun résultat. Ceci est mon code:Rencontre "impossible de lire la propriété 'length' de undefined"

var http = require('http'); 
var fs = require('fs'); 
var formidable = require("formidable"); 
var util = require('util'); 
var exec = require('child_process').exec; 


var ram; 
var disk; 
var cpu; 
var port = 80; 
var ip = "172.19.0.1"; 

//als de user request doet naar form forward dan naar displayForom, else naar processallfieldsoftheForm om 
//invoer van de gebruiker te verwerken 

var server = http.createServer(function (req, res) { 
    if (req.method.toLowerCase() == 'get') { 
     displayForm(res); 

    } else if (req.method.toLowerCase() == 'post') { 
     processAllFieldsOfTheForm(req, res); 
    } 
}); 

//geef de html form weer 
function displayForm(res) { 
    fs.readFile('form.html', function (err, data) { 
     res.writeHead(200, { 
      'Content-Type': 'text/html', 
     'content-length' : data.length 
     //error is here 
     }); 
    res.write(data); 
     res.end(); 
    }); 
} 


//functie om invoer van de gebruiker te verwerken serverside en als variabele op te slaan. 
function processAllFieldsOfTheForm(req, res) { 
var form = new formidable.IncomingForm(); 
form.parse(req, function (err, fields, files) 
{ 
    ram = (fields.mem) 
    disk = (fields.dsk) 
    cpu = (fields.cpu); 
} 
     ); 
      } 


//exec('cat /home/js/text123', function(err, stdout, stderr){ 
//console.log(stdout); 
//}); 


//serverside logs om te illistreren waar de server naar luistert, en waar hij luistert 
server.listen(port, ip); 
console.log("server lisening on " + port + " adress: " + ip); 
+0

Vérifiez le contenu de 'err' – Andreas

Répondre

1

La réponse simple est que le résultat de fs.readFile('form.html'... ne renvoie pas de données.

Assurez-vous que votre fichier form.html est dans le dossier que vous exécutez ce code, sinon, vous devrez spécifier plus du chemin d'accès au fichier.

Vous pouvez également utiliser la variable err transmise dans le rappel pour obtenir une meilleure vérification des erreurs. Essayez d'ajouter:

function displayForm(res) { 
    fs.readFile('form.html', function (err, data) { 
     if (err != null) { 
      throw err; 
      // OR 
      console.log(err); 
      // OR 
      // Code to handle errors 
      return; // If you don't throw 
     } 

     res.writeHead(200, { 
      'Content-Type': 'text/html', 
     'content-length' : data.length 
     }); 
    res.write(data); 
     res.end(); 
    }); 
} 
0

Je crois que c'est là que vous rencontrez ce problème:

function displayForm(res) { 
    fs.readFile('form.html', function (err, data) { 
     res.writeHead(200, { 
      'Content-Type': 'text/html', 
     'content-length' : data.length // here, data is undefined due to some unexpected reason 
     }); 
    res.write(data); 
     res.end(); 
    }); 
} 

Il est préférable de faire quelques avant d'accéder à la propriété des validations de tout objet dans JS. Essayez de connaître la valeur de data avant de l'utiliser comme data.length, un peu comme ceci:

function displayForm(res) { 
    fs.readFile('form.html', function (err, data) { 
     if ((data != undefined || data != null) && (data.length > 0)) { 
      res.writeHead(200, { 
       'Content-Type': 'text/html', 
       'content-length' : data.length // now data will always have some value 
      }); 

      res.write(data); 
      res.end(); 
     } 
    }); 
} 
0

Puisque vous passez err à votre fonction de rappel pour readFile, vous devriez vérifier si err n'est pas défini, il est possible, il y avait une erreur avec votre appel readFile.