【问题标题】:Encountering "cannot read property 'length' of undefined"遇到“无法读取未定义的属性‘长度’”
【发布时间】:2017-10-16 16:35:51
【问题描述】:

我的 nodejs 服务器出现了一些我以前没有遇到的奇怪错误。我得到错误: “TypeError:无法读取未定义的属性‘长度’” 我正在使用 formidable 来处理来自我的 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);

【问题讨论】:

  • 查看err的内容

标签: javascript node.js forms response formidable


【解决方案1】:

简单的回答是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】:

    我相信这就是您遇到此问题的地方:

    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 之前尝试找出data 的值,有点像这样:

    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】:

      由于您将 err 传递给 readFile 的回调函数,您应该检查 err 是否未定义,您的 readFile 调用可能存在一些错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 2020-09-14
        • 2018-01-11
        • 2020-12-23
        • 2020-06-12
        相关资源
        最近更新 更多