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

时间:2019-05-24 19:19:21

标签: javascript node.js express

当我发布这样的表单时,我已经开始使用node.js框架学习express了:

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的专有性,因为当我console.log(req.body)时,我下载了去年创建的另一个项目,并且使用了相同的方法显示相同的输出。

预先感谢您的帮助。

11 个答案:

答案 0 :(得分:9)

尝试一下,

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

console.log(obj); // { title: 'product' }

快乐编码..

答案 1 :(得分:3)

cos该对象基于Null对象。 我发现消除这种情况的最佳方法是,例如,如果您需要完全匹配的测试,请使用:

const groups = {...match.groups} // remove null object for test comparison

答案 2 :(得分:2)

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

 req.body.toString();

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

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

答案 3 :(得分:0)

我建议您使用util之类的检查工具来整齐地记录对象。

即:

const util = require('util'); util.inspect(req.body, false, null);

答案 4 :(得分:0)

您可以尝试以下方法:

app.use(express.urlencoded({ extended: false }));

答案 5 :(得分:0)

我遇到了一些问题,我的终端向我显示了以下说明

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

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

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

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

我认为这对您有帮助

要了解有关扩展选项的更多信息,请阅读文档或此处的某人回答得很好-What does 'extended' mean in express 4.0?

答案 6 :(得分:0)

这是Express中的内置中间件功能。它基于主体解析器解析带有JSON负载的传入请求。

返回仅解析JSON并且仅查看Content-Type标头与type选项匹配的请求的中间件。该解析器接受主体的任何Unicode编码,并支持gzip和deflate编码的自动填充。

在中间件(即req.body)之后,在请求对象上填充了包含已解析数据的新主体对象;如果没有要解析的主体,则Content-Type不匹配,则填充一个空对象({}) ,或发生错误。 app.use( express.urlencoded({ 扩展:true }) );

答案 7 :(得分:0)

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

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

console.log(obj)

它用 Object.prototype 初始化一个新对象,并将 req.body 的所有属性分配给它。

答案 8 :(得分:-1)

我建议像这样使用功能JSON.parse:

$("#frmShippingHeader").validate({ rules: { trailerNumber: { required: true, number:true }, }, messages: { trailerNumber: { required: "Please trailer number", number:"Must be a number" }, } });

答案 9 :(得分:-1)

另一种选择是简单地遍历字典/对象的键值对:

for (let parameter in req) {
    console.log(parameter, '->', query[parameter]);
}

这对我有用。

答案 10 :(得分:-3)

我有同样的问题。我发现问题出在我的ejs文件中。我用了这个:

<form method="POST">

但是使用ajax时,我将方法设置为post,所以当我提交表单时,它发送了一个空的Object和给出的值。当我从ejs中删除该方法时,问题解决了。

我希望对您有帮助