如何修复 [对象:空原型] 标题:'产品'
Posted
技术标签:
【中文标题】如何修复 [对象:空原型] 标题:\'产品\'【英文标题】:how to fix [Object: null prototype] title: 'product' 如何修复 [对象:空原型] 标题:'产品' 【发布时间】:2019-10-11 09:37:41 【问题描述】:当我发布这样的表单时,我已经开始学习 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)
时,它显示相同的输出。
【问题讨论】:
将您的 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 中删除该方法时,问题就解决了。
希望对你有帮助
【讨论】:
以上是关于如何修复 [对象:空原型] 标题:'产品'的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 AttributeError:“列表”对象没有属性“编码”