当我发布这样的表单时,我已经开始使用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)
时,我下载了去年创建的另一个项目,并且使用了相同的方法显示相同的输出。
预先感谢您的帮助。
答案 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)
答案 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中删除该方法时,问题解决了。
我希望对您有帮助