修复错误:无法读取未定义的属性“路径”

时间:2020-03-11 12:11:05

标签: javascript node.js reactjs mongodb multer

我正在使用MERN和multer发布并获取图像和数据。我在Postman中完成此操作没有任何问题,但是当我运行代码时,它将编译以下错误:

TypeError: Cannot read property 'path' of undefined
    at router.post (...routes\property.js:42:34)

代码:

router.post('/add', upload.single('propertyImage'), (req, res, next) => {
  console.log(req.file)
  const propertyImage = req.file.path;

我假设我的req电话打错了吗?我试图将req更改为req.filereq.body.propertyImage,但这会导致完全不同的错误或相同的错误。

我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

您需要添加

enctype = "multipart/form-data" 

在HTML的表单标签中

类似

  form(method='POST', action='/add', enctype = "multipart/form-data")

参考:https://www.npmjs.com/package/multer(请参阅基本用法)

答案 1 :(得分:0)

错误:

from scipy.stats import levene
import numpy as np

Experiment1 = np.array([1.595440,1.419730,0.000000,0.000000])
Experiment2 = np.array([1.433800,2.079700,0.892139,2.384740])
Experiment3 = np.array([0.036930,0.938018,0.995956,1.006970])

levene(Experiment1 ,Experiment2,Experiment3)

LeveneResult(statistic=2.6741725711150446, pvalue=0.12259792666001798)

表示服务器无法解码任何文件。您必须确保两件事:

  1. 您确实正确上传了文件

  2. 您在Express中使用了正确的中间件来解码文件

让我们深入其中。

部分1(客户端)-确保正确使用上传文件。假设您使用TypeError: Cannot read property 'path' of undefined at router.post (...routes\property.js:42:34) ,那么文件输入也必须命名为upload.single('propertyImage'),以便Multer知道如何解码propertyImage请求并将文件与其余输入分开,因为文件和输入以特殊方式合并,只有像Multer这样的特殊解码器才能提取。

您可以使用multipart/form-data内容类型。 Axios示例:

multipart/form-data

PART 2(服务器)-使用解码器来解析输入:

var payload = {
  input1: 'value1',
  propertyImage: file, // file must be a file object
};

var formData = new FormData();

for (let key in payload ) {
  formData.append(key, payload[key]);
}

axios({
  method: 'post',
  url: '/add',
  headers: {
    'Content-Type': 'multipart/form-data',
  },
  data: formData,
})

检查您的Multer设置:

const app = express();
// Middlewares
...
app.use(express.json());
app.use(express.urlencoded({ extended: false }));// put true for nested objects/arrays inputs
...

现在,您应该可以将文件获取为:

const multer = require('multer');

const port = process.env.APP_PORT || 3500;

const entityStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'public/images');// check for correct permission
  },
  filename: (req, file, cb) => {
    const name = 'file-' + Date.now() + '-' + file.originalname;
    cb(null,  name);
  }
});

const upload = multer({storage: entityStorage});