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

Posted

技术标签:

【中文标题】如何修复 [对象:空原型] 标题:\'产品\'【英文标题】:how to fix [Object: null prototype] title: 'product' 如何修复 [对象:空原型] 标题:'产品' 【发布时间】:2019-10-11 09:37:41 【问题描述】:

当我发布这样的表单时,我已经开始学习 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('/');
);

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

[Object: null prototype]  title: 'product' 

而不仅仅是 title: 'product'

我想知道这实际上是 express 的错误还是只是最近添加到 express 的一个适当的,因为我下载了去年创建的另一个项目,它使用了相同的方法,当我做 console.log(req.body) 时,它显示相同的输出。

【问题讨论】:

将您的 url 编码 bodyparser 扩展为 true 而不是 false,这样就可以了。 【参考方案1】:

这实际上是一个很好的设计。默认情况下,对象继承了包含一些辅助函数(.toString().valueOf())的Object.prototype。现在,如果您使用 req.body 并且没有向 HTTP 请求传递任何参数,那么您会期望 req.body 为空。如果它只是“一个普通对象”,它就不会完全是空的:

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

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

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

【讨论】:

这里没有得到这部分:你没有向 HTTP 请求传递任何参数,那么你会期望 req.body 为空。如果它只是“一个常规对象”,它就不会是:req.body.toString();。你能详细说明一下吗? @AmitDas 他的意思是即使req.body 没有任何“自己的”属性(例如上面示例中的title),它仍然会继承默认的对象原型并具有方法例如toString() 使其非空。【参考方案2】:

试试这个,

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

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

编码愉快..!

【讨论】:

这是我最终修复一些测试的方法,但它似乎是错误的 const groups = ...match.groups // 删除空对象进行测试比较 谢谢。这解决了问题,但不能很好地打印 JSON。【参考方案3】:

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

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))

我觉得对你有帮助

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

【讨论】:

extended:true 和extended:false 的区别在于底层解析库的使用。 github.com/expressjs/body-parser#bodyparserurlencodedoptions 与描述的问题无关(这不是问题)。【参考方案4】:

因为对象是基于 Null 对象的。 我发现最好的方法是去掉这个,例如,如果你需要一个完全匹配的测试是使用:

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

【讨论】:

【参考方案5】:

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

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

console.log(obj)

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

【讨论】:

【参考方案6】:

下面的代码对我有用

app.use(express.urlencoded( extended : true ));
app.use(express.json());

【讨论】:

【参考方案7】:

只需将extended: false 更改为extended: true 它适用于较新版本的body-parser。 它在 ^1.19.0 版本中工作

【讨论】:

【参考方案8】:

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

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

这就是我的诀窍。

【讨论】:

【参考方案9】:

你可以试试这个:

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

【讨论】:

你能补充几句解释这段代码如何回答 OP 的问题吗? extended:true 和extended:false 的区别在于底层解析库的使用。 github.com/expressjs/body-parser#bodyparserurlencodedoptions 与描述的问题无关(这不是问题)。【参考方案10】:

我建议像这样使用 JSON.parse 函数:

const form = JSON.parse(JSON.stringify(req.body)) console.log(form.title)

【讨论】:

【参考方案11】:

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

<form method="POST">

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

希望对你有帮助

【讨论】:

以上是关于如何修复 [对象:空原型] 标题:'产品'的主要内容,如果未能解决你的问题,请参考以下文章

如何修复在空颤动上调用的方法“包含密钥”[重复]

修复 PHP 空函数

如何修复 AttributeError:“列表”对象没有属性“编码”

npm 审计修复后如何解决原型污染 lodash 需要人工审核

如何修复 AFK 通道的“空”输出

如何修复 trainserver 空服务器? [关闭]