【问题标题】:What is wrong in this NodeJs multer file upload code?这个 NodeJs multer 文件上传代码有什么问题?
【发布时间】:2019-04-08 14:50:48
【问题描述】:

我正在尝试学习 Node 的 multer 库,该库对于通过 API 调用上传文件很有用,
我有一个监听端口 4300 的基本快速应用程序设置,
使用 multer 的 diskStorage 函数来定义我希望存储上传文件的文件系统位置。

并暴露了 3 个端点 -
第一名接受单文件上传,keyname - singleFile
第二个用于接受一个键名的文件数组,keyname - multipleFiles
第三用于接受不同键名的单个/数组文件数组。

我指的是以下-
1.https://www.npmjs.com/package/multer
2.https://medium.com/@bmshamsnahid/nodejs-file-upload-using-multer-3a904516f6d2

var express = require('express')
var cors = require('cors')
var multer  = require('multer')
var async = require('async')

var app = express();
app.use(cors());
app.listen(4300, function () {
    console.log('listening on port 4300!');
});


var storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, '/home/user/Desktop/node/')
    },
    filename: (req, file, cb) => {
      cb(null, file.fieldname + '-' + Date.now())
    }
});
var upload = multer({storage: storage});

app.post('/single', upload.single('singleFile'), function (req, res, next) {
    console.log(req.file.filename);
    res.send({'message': 'File received! k thnkx bye!'});
});

app.post('/multiple', upload.array('multipleFiles', 3), function (req, res, next) {
    console.log(req.files);

    async.each(req.files, function (temp, callback) {
       console.log(temp);
    }, function (err) {
       if (err) {
           console.log('Error ' + err);
       } else {
        console.log('Success');
       }
    });

    res.send({'message': 'Files received! k thnkx bye!'});
});

var cpUpload = upload.fields([{ name: 'singleFile', maxCount: 1 }, { name: 'multipleFiles', maxCount: 3 }])
app.post('/fields', cpUpload, function (req, res, next) {
    console.log(req);
    res.send({'message': 'Files received! k thnkx bye!'});
});

以下是使用 Postman 工具进行的 API 调用 - 1。单个文件上传 API-

2。多文件上传API-

我在 console.logs 上收到“TypeError: Cannot read property 'filename' of undefined”可能是因为一些错误。

调试控制台-

/home/user/.nvm/versions/node/v10.11.0/bin/node --inspect-brk=10250 Node-Tutorials/Apps/multer.js 
Debugger listening on ws://127.0.0.1:10250/87170633-e582-4ac5-b099-0d2e6d090a7f
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
listening on port 4300!
TypeError: Cannot read property 'filename' of undefined
    at /home/user/office/node-crud-app/Node-Tutorials/Apps/multer.js:23:26
    at callbacks (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:164:37)
    at multerMiddleware (/home/user/office/node-crud-app/node_modules/multer/lib/make-middleware.js:18:41)
    at callbacks (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:164:37)
    at param (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:138:11)
    at pass (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:173:5)
    at Object.router [as handle] (/home/user/office/node-crud-app/node_modules/express/lib/router/index.js:33:10)
    at next (/home/user/office/node-crud-app/node_modules/connect/lib/proto.js:193:15)
    at cors (/home/user/office/node-crud-app/node_modules/cors/lib/index.js:188:7)

有人可以帮忙修复我的代码,下载文件系统上的文件吗?

【问题讨论】:

  • 你能把上传页面的HTML发给我们吗?
  • @Sridhar 更新问题,添加 API 请求截图
  • 您的代码在我的笔记本电脑上运行良好。我通过在不附加任何文件的情况下进行 POST 调用重现了您报告的错误。你能检查一下是不是这样?
  • 可以分享请求截图吗?我在 localhost:4300/single API 上收到“TypeError: Cannot read property 'filename' of undefined”,在 localhost:4300/multiple API 上收到“undefined”

标签: node.js multer


【解决方案1】:

console.logs 上的“TypeError: Cannot read property 'filename' of undefined”可能是一些错误。

如果file 为空,这可能是可能的。

处理案件,

'use strict';

var express = require('express')
var cors = require('cors')
var multer = require('multer')
var async = require('async')

var app = express();
app.use(cors());
app.listen(4300, function () {
  console.log('listening on port 4300!');
});


var storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, './uploads')
  },
  filename: (req, file, cb) => {
    cb(null, file.fieldname + '-' + Date.now())
  }
});
var upload = multer({storage: storage});

const params = {
  '/single': 'file',
  '/multiple': 'files'
};

function validate(req, res, next) {
  let param = params[req.url];
  if (!req[param]) {
    return res.send({
      errors: {
        message: `${param} cant be empty`
      }
    });
  }
  next();
}

app.post('/single', upload.single('singleFile'), validate, function (req, res, next) {
  console.log(req.file.filename);
  res.send({'message': 'File received! k thnkx bye!'});
});

app.post('/multiple', upload.array('multipleFiles', 3), validate, function (req, res, next) {
  console.log(req.files);

  async.each(req.files, function (temp, callback) {
    console.log(temp);
  }, function (err) {
    if (err) {
      console.log('Error ' + err);
    } else {
      console.log('Success');
    }
  });

  res.send({'message': 'Files received! k thnkx bye!'});
});

var cpUpload = upload.fields([{name: 'singleFile', maxCount: 1}, {name: 'multipleFiles', maxCount: 3}])
app.post('/fields', cpUpload, function (req, res, next) {
  console.log(req);
  res.send({'message': 'Files received! k thnkx bye!'});
});

应该处理空文件上传。

【讨论】:

  • 在 API 代码中添加了您的验证函数和参数,在这两种情况下都给我“文件不能为空”:/
  • 啊工作,对于 /multiple 和 /fields 我也这样做?添加验证功能作为参数?
  • @AniruddhaRaje 更新了代码以处理多个文件 :)
【解决方案2】:

尝试安慰 req.files.filename。

我在 req.files.filename 中找到了文件名。

更正 - req.files 是对象数组。

【讨论】:

  • hmmm 我想如果它是req.files,它应该是一个数组,不是吗?我的意思是req.files = [ {...}]
  • @Manish 相同的代码?我在 /single API 上遇到同样的错误,在 /multiple API 上遇到未定义的错误
  • @AniruddhaRaje 在 req.files 上使用 async.each 并在 async 中使用控制台。
  • 控制台日志中仍然出现“未定义”,我已使用异步更新了代码。
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2014-08-29
  • 2013-06-05
  • 2014-06-04
相关资源
最近更新 更多