如何修复[对象:null原型] {标题:'产品'}

Moh*_*rab 3 javascript node.js express

我已经开始学习node.jsexpress的框架,当我张贴的形式是这样的:

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('/');
});
Run Code Online (Sandbox Code Playgroud)

当我这样做console.log(req.body)时显示:

[Object: null prototype] { title: 'product' }
Run Code Online (Sandbox Code Playgroud)

而不只是 { title: 'product' }

我想知道这是否实际上是express的错误,或者只是最近添加的express的专有性,原因是我下载了去年创建的另一个项目,并且当我console.log(req.body)显示相同的输出时,它使用了相同的方法。

在此先感谢您的帮助。

Tan*_*eem 20

尝试这个,

const obj = JSON.parse(JSON.stringify(req.body)); // req.body = [Object: null prototype] { title: 'product' }

console.log(obj); // { title: 'product' }
Run Code Online (Sandbox Code Playgroud)

快乐编码...!

  • const groups = {...match.groups} // 删除空对象以进行测试比较 (2认同)

小智 11

您可以Object.assign通过以下方式解决您的问题:

const obj = Object.assign({},req.body)

console.log(obj)
Run Code Online (Sandbox Code Playgroud)

它初始化一个新对象并为其Object.prototype分配所有属性。req.body


Onu*_*gul 10

我遇到了一些问题,我的终端向我展示了以下解释

body-parser deprecated undefined extended: provide extended option at express

我用这个 app.use(bodyParser.urlencoded({extended: false}))

或者

您正在运行 4.16+ 的 Express 版本,然后只需键入

app.use(express.urlencoded({extended: true}))

我认为它可以帮助你

要了解有关扩展选项的更多信息,请阅读文档或此处有人回答得很好 - express 4.0 中的“扩展”是什么意思?

  • Extended:true 和 Extended:False 之间的区别在于底层解析库的使用。https://github.com/expressjs/body-parser#bodyparserurlencodedoptions 它与所描述的问题无关(这不是问题)。 (3认同)

dcs*_*san 7

因为该对象是基于 Null 对象的。我发现最好的方法是去掉这个,例如,如果您需要测试的精确匹配,则使用:

const groups = {...match.groups} // remove null object for test comparison
Run Code Online (Sandbox Code Playgroud)


Jon*_*lms 6

那实际上是好的设计。默认情况下,对象继承Object.prototype包含一些助手(.toString().valueOf())。现在,如果您使用req.body并且没有向HTTP请求传递任何参数,那么您将期望req.body为空。如果只是“常规对象”,则不会是:

 req.body.toString();
Run Code Online (Sandbox Code Playgroud)

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

所以不,这不是需要修复的错误,那就是对JS功能的充分利用。

  • @AmitDas,他的意思是即使`req.body`没有任何“自己的”属性(例如上面示例中的“title”),它仍然会继承默认的对象原型,并且具有诸如“toString()”之类的方法` 使其非空。 (9认同)
  • 答案并不能说明解决方案 (9认同)
  • 这里没有得到这部分内容:*您没有将参数传递给 HTTP 请求,然后您希望 req.body 为空。如果它只是“一个普通对象”,它就不会是:`req.body.toString();`*。你能详细说明一下吗? (4认同)

Yas*_*M Y 6

下面的代码对我有用

app.use(express.urlencoded({ extended : true }));
app.use(express.json());
Run Code Online (Sandbox Code Playgroud)


小智 6

只需更改{extended: false}{extended: true}即可适用于较新版本的主体解析器。它可以在 ^1.19.0 版本中运行