gpt4 book ai didi

javascript - 如何使用 multer 或 body-parser 上传文件

转载 作者:IT老高 更新时间:2023-10-28 23:14:02 25 4
gpt4 key购买 nike

我是一名 NodeJS 初学者,正在阅读《使用 MongoDB 和 NodeJS 进行 Web 开发》一书。我被'multer'困在第6章。当我使用 multer 进行文件上传时,服务器会抛出以下错误:

/Users/fk / Documents / imageuploader / node_modules / express / lib / application.js: 209
throw new TypeError('app.use() requires middleware functions'); ^

TypeError: app.use() requires middleware functions

但是当我用 bodyParser 替换它时,服务器会启动,但是当我单击上传按钮时,它会在浏览器上显示以下错误。

500 TypeError: Cannot read property 'file' of undefined

但是,它应该将我重定向到显示上传文件的另一个页面。

这是我的 bodyParser 代码,请查看我是否正确使用它,因为它在服务器启动时给了我“body-parser deprecated”。我见过像我这样的其他问题,我也关注过,但它们都没有真正起作用。

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));

app.use(bodyParser({
uploadDir: path.join(__dirname, '../public/upload/temp')
}));

以下代码显示了我如何使用 multer,以防万一有什么我不应该做的事情,请告诉我。在上传文件的情况下,body-parser 或 multer 哪个更好?

app.use(multer({
dest: path.join(__dirname, '../public/upload/temp')
}));


var saveImage = function() {
var possible = 'abcdefghijklmnopqrstuvwxyz0123456789',
imgUrl = '';

for (var i = 0; i < 6; i += 1) {
imgUrl += possible.charAt(Math.floor(Math.random() * possible.length));
}

var tempPath = req.files.file.path,
ext = path.extname(req.files.file.name).toLowerCase(),
targetPath = path.resolve('./public/upload/' + imgUrl + ext);

if (ext === '.png' || ext === '.jpg' || ext === '.jpeg' || ext === '.gif') {
fs.rename(tempPath, targetPath, function(err) {
if (err) throw err;
res.redirect('/images/' + imgUrl);
});
} else {
fs.unlink(tempPath, function() {
if (err) throw err;

res.json(500, {
error: 'Only image files are allowed.'
});
});
}
};
saveImage();

前面的代码块是我用来上传文件的逻辑。在错误中,它在 saveImage 函数的以下行中将"file"称为未定义。它无法获取路径,因此根据 saveImage 函数的 else 部分抛出错误 500。为什么"file"在这里未定义?我不明白。

var tempPath = req.files.file.path,

最佳答案

multer() 返回一个使用您指定的设置的中间件生成器,因此您不能将其返回值直接传递给 app.use()。您可以在 documentation 中看到它可以生成的所有中间件类型。 ,但通常生成的中间件是在路由级别添加的,而不是像其他正文解析器那样全局添加。这是因为您通常会传入您期望的文件字段的名称。

例如,这将接受表单字段名称为 foo 的单个文件(以及任何非文件字段):

var upload = multer({
dest: path.join(__dirname, '../public/upload/temp')
});

// ...

app.post('/upload', upload.single('foo'), function(req, res) {
if (req.file) {
console.dir(req.file);
return res.end('Thank you for the file');
}
res.end('Missing file');
});

此外,body-parser 当前不导出支持 multipart/form-data 的中间件,因此您不能使用该模块来处理上传的文件(嗯,简短以 application/x-www-form-urlencoded 形式或其他形式传递 base64 编码的字符串,但效率要低得多)。

关于javascript - 如何使用 multer 或 body-parser 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36202618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com