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 更新我的 name
和 price
对象,但我无法使用 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 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空
Node.js, express, html form req.body 未定义