我已经开始学习express框架下的node.js,当我发布这样的表格时:

router.get('/add-product',(req,res,next)=>{
    res.send('<form action="/product" method="POST" ><input type="text" name="title" /><button type="submit">Submit</button></form>');
});
     
router.post('/product',(req,res,next)=>{
    console.log(req.body);
    res.redirect('/');
});

当我做console.log(req.body)次时,它会显示:

[Object: null prototype] { title: 'product' }

而不是仅仅{ title: 'product' }

我想知道这究竟是express的一个错误,还是它最近被添加到express中的一个恰当的做法,因为我下载了go 年创建的另一个项目,它使用了相同的方法,当我完成console.log(req.body)次时,它显示了相同的输出.

推荐答案

那确实是个不错的设计.默认情况下,对象继承包含一些帮助器函数(.toString().valueOf())的Object.prototype.现在,如果您使用req.body,并且没有向HTTP请求传递任何参数,那么您会认为req.body是空的.如果它只是一个"常规物体",它就不会完全是空的:

console.info(({ "toString": 5 })['toString']);   // 5
console.info(({})['toString']);                  // [Function: toString]

有一种方法可以创建"空对象",即没有任何属性/原型的对象,即Object.create(null).您正在控制台中看到其中一个对象.

所以不,这不是一个需要修复的bug,这只是对JS特性的极大利用.

Angular相关问答推荐

我使用Ngrx的子集 Select 器不起作用

Angular:浏览器中未显示一些Google Content图标

tabindex on button on button in MatMenu in angular不工作

使用Angular 13的NgxPrinterService打印时,第二页上的空白区域

要素存储更改根存储状态

无效的ICU消息.缺少';}';|Angular material 拖放(&A)

Primeng:安装ANGLE 16.2.0版本

Angular 15 Ref 错误:初始化前无法访问组件 A

如何在 Angular14 中创建带有验证的自定义输入组件?

手动关闭 SSE 连接:Angular

如何访问父组件中提供的 TemplateRef 内的服务?

为什么 Redux 中的对象应该是不可变的?

angular material日期 Select 器中的日期不正确

如何测试 Angular2 的 router.navigate?

找不到模块'@angular/compiler'

如何从组件模板将数组作为 Input() 传递?

如何手动延迟加载模块?

Angular - 工作区中未设置配置

如何在 Angular 2 中动态添加和删除表单字段

ngIf - 判断后表达式已更改