Formidable and Node.js TypeError: Cannot read property 'path' of undefined
Formidable and Node.js TypeError: Cannot read property 'path' of undefined
如果您正在阅读本文,您可能正在学习 Manuel Kiessling 的 Node 教程。我在完成教程的文件上传部分时收到以下错误。
fs.rename(files.upload.path, "img/img.jpg", function(error) {
^
TypeError: Cannot read property 'path' of undefined
我四处搜索,找到了 this and this,但它们都没有定论,也没有提供什么帮助。
首先,教程确实以错误的顺序传递了请求和响应。我做的第一件事是将顺序从 (response, request)
更改为 (request, response)
。 (确保在任何地方都这样做)。这样做的原因是因为我很确定 HTTP
的 createServer()
中的 onRequest
函数按此顺序传递它们。
我这样做后,仍然遇到同样的错误。但是通过记录来自我的表单的信息
...
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
。使用它会返回另一个错误,它不是一个字符串(或者至少不是一个 formidable 会接受的字符串)。 toString()
好像也没用,所以我使用了替代转换:
fs.rename(fields.upload + "", "img/img.jpg", function(error) {
...
}
这并不理想,但它确实起到了作用。
这是用 node@0.10.35
和 formidable@1.0.17
完成的。我不知道我的解决方案是否适用于所有人,但希望它能为你们中的一些人指明正确的方向。差异可能是由于他在教程中使用旧版本的节点和强大的事实。
我遇到了同样的问题,同样的教程。原来我在打印 HTML 表单的 requestHandlers start() 函数中有错字。我有
'<form action="/upload" enctype="multipart/form-date" ' +
应该是什么时候
'<form action="/upload" enctype="multipart/form-data" ' +
(将 "date" 更改为 "data")。解决这个问题使它对我有用。
因此,请仔细查看您的 requestHandlers start() 函数中的 HTML 表单数据,看看是否存在任何阻止文件正确上传的拼写错误。
我有同样的错误,因为输入字段的名称与 fs.rename 尝试使用的不同。
基本上可以确定这一行的名字:
'<input type="file" name="UPLOADEDIMAGE">'+
与这两行相同:
fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png", function(err) {
fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png");
我遇到了同样的问题,苦苦挣扎才最终发现我打错了字。
我输入的内容:
res.write('<form action="fileupload" method="post" enctype="multipart/formdata">');
应该是什么:
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
注意 form-data
中缺少的 -
。
如果您正在阅读本文,您可能正在学习 Manuel Kiessling 的 Node 教程。我在完成教程的文件上传部分时收到以下错误。
fs.rename(files.upload.path, "img/img.jpg", function(error) {
^
TypeError: Cannot read property 'path' of undefined
我四处搜索,找到了 this and this,但它们都没有定论,也没有提供什么帮助。
首先,教程确实以错误的顺序传递了请求和响应。我做的第一件事是将顺序从 (response, request)
更改为 (request, response)
。 (确保在任何地方都这样做)。这样做的原因是因为我很确定 HTTP
的 createServer()
中的 onRequest
函数按此顺序传递它们。
我这样做后,仍然遇到同样的错误。但是通过记录来自我的表单的信息
...
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
。使用它会返回另一个错误,它不是一个字符串(或者至少不是一个 formidable 会接受的字符串)。 toString()
好像也没用,所以我使用了替代转换:
fs.rename(fields.upload + "", "img/img.jpg", function(error) {
...
}
这并不理想,但它确实起到了作用。
这是用 node@0.10.35
和 formidable@1.0.17
完成的。我不知道我的解决方案是否适用于所有人,但希望它能为你们中的一些人指明正确的方向。差异可能是由于他在教程中使用旧版本的节点和强大的事实。
我遇到了同样的问题,同样的教程。原来我在打印 HTML 表单的 requestHandlers start() 函数中有错字。我有
'<form action="/upload" enctype="multipart/form-date" ' +
应该是什么时候
'<form action="/upload" enctype="multipart/form-data" ' +
(将 "date" 更改为 "data")。解决这个问题使它对我有用。
因此,请仔细查看您的 requestHandlers start() 函数中的 HTML 表单数据,看看是否存在任何阻止文件正确上传的拼写错误。
我有同样的错误,因为输入字段的名称与 fs.rename 尝试使用的不同。
基本上可以确定这一行的名字:
'<input type="file" name="UPLOADEDIMAGE">'+
与这两行相同:
fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png", function(err) {
fs.rename(files.UPLOADEDIMAGE.path, "/tmp/test.png");
我遇到了同样的问题,苦苦挣扎才最终发现我打错了字。
我输入的内容:
res.write('<form action="fileupload" method="post" enctype="multipart/formdata">');
应该是什么:
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
注意 form-data
中缺少的 -
。