Req.body 在 node.js 中不可迭代

Posted

技术标签:

【中文标题】Req.body 在 node.js 中不可迭代【英文标题】:Req.body is not iterable in node.js 【发布时间】:2019-02-09 12:27:00 【问题描述】:

我正在构建模拟 restful API 以更好地学习。我正在使用 MongoDB 和 node.js,为了测试我使用 postman。

我有一个发送更新请求router.patch 的路由器。在我的数据库中,我有name(字符串)、price(数字)和imageProduct(字符串-我保存图像的路径)。

我可以在邮递员上使用 raw-format 更新我的 nameprice 对象,但我无法使用 form-data 更新它。据我了解,在 raw-form 中,我使用数组格式更新数据。有没有办法在 form-data 中做到这一点?使用form-data的目的,我想上传一个新的图片,因为我可以更新productImage的路径,但是我不能上传一个新的图片公共文件夹。我该如何处理?

以原始形式更新数据的示例

[ "propName": "name", "value": "test"]

router.patch

router.patch('/:productId', checkAuth, (req, res, next) => 
const id = req.params.productId;

const updateOps = ;

for (const ops of req.body) 
    updateOps[ops.propName] = ops.value;

Product.updateMany(_id: id, $set: updateOps)
    .exec()
    .then(result => 
        res.status(200).json(
            message: 'Product Updated',
            request: 
                type: 'GET',
                url: 'http://localhost:3000/products/' + id
            
        );
    )
    .catch(err => 
        console.log(err);
        res.status(500).json(
            err: err
        );
    );
);

【问题讨论】:

req.body 不像数组、映射或参数那样可迭代,所以你不能使用 for of 循环遍历它,尝试使用 for in 循环作为初学者:***.com/questions/29285897/…跨度> 签出:***.com/a/26347677/3938031 @maljukan 实际上我可以在 raw-form 中做到这一点(我给出了例子),但我不能在 form-data中做到这一点> 形式。据我了解,我需要将其视为一个数组 调试并尝试@NoelKriegler 的建议,我忘记了:) 好的,我马上检查。我会告诉你的 【参考方案1】:

使用 for...of 是个好主意,但不能像循环对象的属性那样使用它。值得庆幸的是,javascript 有一些新函数可以将“对象的属性”转换为可迭代对象。

使用Object.keys:

const input = 
  firstName: 'Evert',
 
for (const key of Object.keys(input)) 
  console.log(key, input[key]);

您还可以使用 Object.entries 来键入键和值:

const input = 
  firstName: 'Evert',
 
for (const [key, value] of Object.entries(input)) 
  console.log(key, value);

【讨论】:

【参考方案2】:

我知道这个答案可能为时已晚,无法帮助您,但它可能会在 2020 年及以后对某人有所帮助。

首先,注释掉这个块:

//const updateOps = ;

//for (const ops of req.body) 
//updateOps[ops.propName] = ops.value;
//

并改变这一行:

Product.updateMany(_id: id, $set: updateOps)

到这里:

Product.updateMany(_id: id, $set: req.body)

其他一切都很好。我遇到了类似的问题,但这个链接帮助了我: [What is the difference between ( for... in ) and ( for... of ) statements in JavaScript?

【讨论】:

这如何解决问题? if only cmets out the line?【参考方案3】:

要处理多部分表单数据,bodyParser.urlencoded()app.use(bodyParser.json());body 解析器将不起作用。

请参阅建议的模块 here 以解析多部分正文。

在这种情况下,您需要使用multer

 var bodyParser = require('body-parser');
 var multer = require('multer');
 var upload = multer();

// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/xwww-
app.use(bodyParser.urlencoded( extended: true )); 
//form-urlencoded

// for parsing multipart/form-data
app.use(upload.array()); 
app.use(express.static('public'));

【讨论】:

以上是关于Req.body 在 node.js 中不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:req.params 与 req.body

即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空

Node.js、multer 和 req.body 为空

Node.js, express, html form req.body 未定义

Node.js(Express API):req.body.myobject 未定义且无法正常工作

使用Express node.js的post表单接收req.body为空。