【问题标题】: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,这样就可以了。

标签: angular javascript node.js express


【解决方案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?

【讨论】:

【解决方案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 }));
            

            【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

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

              <form method="POST">
              

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

              希望对你有帮助

              【讨论】:

                猜你喜欢
                • 2020-03-14
                • 1970-01-01
                • 2022-11-16
                • 1970-01-01
                • 1970-01-01
                • 2020-04-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多