TypeError:无法调用方法'结束'在简单的节点文件上传

时间:2014-08-08 15:36:27

标签: node.js upload

下面是使用'connect-busboy'模块的简单文件上传实现的参考。我正在使用带有Backbone前端结构的Express设置。

File uploading with Express 4.0: req.files undefined

我尝试使用上面的方法来创建简单的文件上传,并且我一直收到此错误:

_stream_readable.js:483    
    dest.end();
         ^
TypeError: Cannot call method 'end' of undefined
    at IncomingMessage.onend (_stream_readable.js:483:10)
    at IncomingMessage.g (events.js:180:16)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickCallback (node.js:415:13)

做一些研究我得到的修正与我的代码无关。我完全按照上面的定义实现了这个解决方案,但我没有使用Jade模板构建器。另外,我从localhost运行节点服务器。这会引起问题吗?

如果有人能提供帮助那就太棒了。谢谢!

P.S。我复制并粘贴原始代码只更改路由和结束重定向,其中两者都没有导致问题(服务器正确地看到请求通过路由进入,并且它永远不会到达重定向,因为没有控制台日志是输出

编辑 - 添加以下代码

server.js route

var express = require('express');
var fs = require('fs');
var busboy = require('connect-busboy');
...
app.use(busboy());
...
app.post('/list', function(req, res) {
    console.log("HIT - hasher!");  
    var fstream;
    req.pipe(req.busboy);
    req.busboy.on('file', function (fieldname, file, filename) {
        console.log("Uploading: " + filename); 
        fstream = fs.createWriteStream(__dirname + '/uploads/' + filename);
        file.pipe(fstream);
        fstream.on('close', function () {
            res.redirect('lists');
        });
    });
 });

list.html模板

<form enctype="multipart/form-data" action="../list/" method="post" data-abide>
...
<span id="ulbtnview">File Upload</span>
<input id="uplbtn" type="file" class="upload" required>
<small class="error">A valid list file is required.</small>
...
<div class="large-5 columns">
<input id="uploadfile" type="submit" class="button" value="Submit" style="padding-right: 1.5rem; padding-left: 1.5rem; padding-top: 0.5rem; padding-bottom: 0.6rem;"></div>
...
</form>

问题是我的输入元素需要'name'属性。没有它,表单将处理,但不会将数据发送到服务器。

<input id="uplbtn" type="file" class="upload" required>

<input id="uplbtn" type="file" class="upload" name="file-new" required>

http://www.w3.org/TR/html401/interact/forms.html#successful-controls

1 个答案:

答案 0 :(得分:0)

我有类似的情况,我得到同样的错误。在放app.use(busboy());之前我错误地定义了我的路由器。在我改变之后,代码确实完美无缺。