Javascript 当与multer一起用于多部分数据时,hasOwnproperty变得未定义

Javascript 当与multer一起用于多部分数据时,hasOwnproperty变得未定义,javascript,node.js,express,multer,Javascript,Node.js,Express,Multer,我的代码如下所示: var express = require('express'); var mongoose = require('mongoose'); var bodyParser = require('body-parser'); var multer = require('multer'); var user = require('./../model/user'); var path = require('path'); var upload = multer(); var aws

我的代码如下所示:

var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var multer = require('multer');
var user = require('./../model/user');
var path = require('path');
var upload = multer();
var awsUpload = require('./../config/fileUpload.js');
var Promise = require('promise');
var item = require('./../model/items.js');
var item_image = '';

var storage = multer.diskStorage({
    destination: function(req, file, callback) {
        callback(null, './public/images')
    },
    filename: function(req, file, callback) {
        item_image = file.fieldname + '-' + Date.now() + path.extname(file.originalname);
        callback(null, item_image)
    }
});


var itemAdd = function(req, res) {
    upload = multer({
        limits: {
            fileSize: 1000000,
            files: 1
        },
        storage: storage,
        fileFilter: function(req, file, callback) {
            var ext = path.extname(file.originalname)
            if (ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') {
                return callback(res.end('Only images are allowed'), null)
            }
            callback(null, true);
        }
    }).single('item_img');
    upload(req, res, function(err) {
        var foodtruck_id = req.body.foodtruck_id;
        var newItem = new item();
        var itemList = [];
        newItem.item_name = req.body.item_name;
        newItem.item_tag = req.body.item_tag;
        newItem.item_description = req.body.item_description;
        newItem.item_category = req.body.item_category;
        newItem.item_discount_price = req.body.item_discount_price;

        for (var key in req.body) {
            if (req.body.hasOwnProperty(key)) {
                if (key == 'item_illustrations') {
                    newItem.item_illustrations = req.body[key];
                }
            }
        }
        newItem.item_stock = req.body.item_status;
        newItem.item_price = req.body.item_price;

        if ((foodtruck_id) && (foodtruck_id.trim() != '')) {
            foodtruck.findById(foodtruck_id.trim(), function(err, foodtrucks) {
                if (err)
                    res.json({
                        status: '500',
                        message: 'There is no data available'
                    });

                newItem.save(function(err, savedItem) {
                    if (!err) {
                        foodtrucks.item_list.push(savedItem._id);
                        foodtrucks.save(function(err, truck) {
                            foodtruck.find({
                                _id: truck._id
                            }).populate('item_list').exec(function(err, foodtrucks) {
                                res.json({
                                    status: '200',
                                    message: 'New item added successfully',
                                    data: foodtrucks
                                });
                            });
                        });
                    } else {
                        res.json({
                            status: '500',
                            message: 'Error while saving new item'
                        });
                    }
                });


            });

        }
    });

};
app.js

app.post('/test',itemAddition);

现在这里发生的是,当我将req.body.hasOwnProperty与x-www-formurlencoded一起使用时,它工作得很好,但是每当我用multer(多部分数据)添加它时,它都会给我req.body.hasOwnProperty不是一个函数。有什么方法可以解决这个问题吗?

req.body
是一个没有原型的对象:它是用
对象创建的。create(null)
因此不会继承
对象的
hasOwnProperty
。prototype
。这是一件好事,因为如果用户传递了一个名为
hasOwnProperty
的字段,他们将能够破坏您的代码

请改用中的
运算符,通常:

if (key in req.body) {
但在循环的情况下,您根本不需要检查:

for (var key in req.body) {
    if (key == 'item_illustrations') {
        newItem.item_illustrations = req.body[key];
    }
}
在这种特殊情况下,只需在没有循环的情况下获得所需的值:

newItem.item_illustrations = req.body.item_illustrations;

req.body
是一个无原型的对象:它是使用
object.create(null)
创建的,因此不会从
对象.prototype继承
hasOwnProperty
。这是一件好事,因为如果用户传递了一个名为
hasOwnProperty
的字段,他们将能够破坏您的代码

请改用
中的
运算符,通常:

if (key in req.body) {
但在循环的情况下,您根本不需要检查:

for (var key in req.body) {
    if (key == 'item_illustrations') {
        newItem.item_illustrations = req.body[key];
    }
}
在这种特殊情况下,只需在没有循环的情况下获得所需的值:

newItem.item_illustrations = req.body.item_illustrations;

不要在所有键都由用户输入控制的对象上使用
hasOwnProperty
。这就是为什么它是一个没有原型的物体。相反,
key in req.body
在控制台的
req.body
内容中可以得到什么?不要在所有键都由用户输入控制的对象上使用
hasOwnProperty
。这就是为什么它是一个没有原型的物体。相反,
输入请求正文
控制台中的
req.body
内容是什么?我正在从邮递员那里传递项目插图[0],项目插图[1]等等。这种功能是否适用于您的解决方案?@mrugeshtaker:Dunno,试试看,可能会。从邮递员那里,我正在传递item_插图[0],item_插图[1]等等。这种功能能与您的解决方案配合使用吗?@mrugeshtaker:不知道,试试看,可能会。