代码之家  ›  专栏  ›  技术社区  ›  codenerd123

遇到“无法读取未定义的属性‘length’”

  •  0
  • codenerd123  · 技术社区  · 7 年前

    我的nodejs服务器有一些奇怪的错误,我以前没有遇到过。我得到错误: 我正在使用强大的处理从我的html页面的任何表单数据。尝试了很多方法来修复它,并在网上寻找有类似问题但没有任何结果的人。这是我的代码:

    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);
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Nicholas Robinson    7 年前

    简单的答案是 fs.readFile('form.html'... 未返回数据。

    form.html 文件位于您运行此代码的文件夹中,否则,您必须指定文件的更多路径。

    您也可以使用 err 变量传递到回调以更好地检查错误。尝试添加:

    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();
        });
    }
    
        2
  •  0
  •   Prashant Saini    7 年前

    我相信这就是你遇到这个问题的地方:

    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();
        });
    }
    

    最好在访问JS中任何对象的属性之前进行一些验证。试着找出 data 在将其用作 data.length ,有点像这样:

    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();
            }
        });
    }
    
        3
  •  0
  •   Kulix    7 年前