node.js - 类型错误 : Cannot call method 'end' in simple node file upload

标签 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 模板生成器。此外,我正在本地主机上运行 Node 服务器。这会导致问题吗?

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

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

编辑 - 在下面添加代码

server.js 路由

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

最佳答案

我遇到过类似的情况,也遇到了同样的错误。我在放置 app.use(busboy()); 之前错误地定义了我的路由器。更改后,代码确实可以完美运行。

关于node.js - 类型错误 : Cannot call method 'end' in simple node file upload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25207125/

相关文章:

php - 保留 php 上传的时间戳

node.js - 如何使用 Node.js 导入/需要 Browserify 编译文件

python - 在 Django 项目中使用 Web 套接字的最佳方法是什么?

javascript - 无需身份验证即可使用 jwt 保护 api key

javascript - 隐藏/显示 Canvas 内的图像

android - 升级 Android 应用程序时 apk 未正确签名

javascript - 难以理解NodeJS中的回调方式

node.js - 一个 Package.json 来管理 Node 和 React 依赖项

perl - 如何根据内容长度或 MIME 类型中止 Catalyst 上传?

powershell - 使用响应流使用 Powershell 上传文件