【问题标题】:Cannot convert object to primitive value无法将对象转换为原始值
【发布时间】:2016-12-15 12:57:15
【问题描述】:

我将数据发布到节点服务器:

{
  "form_1": [{
    "resultName": "",
    "level": "",
    "unitOrder": "",
    "winner": "",
    "winnerOrder": "",
    "date": "1",
    "score": ""
  }],
  "form_2": [{
    "resultName": "",
    "level": "",
    "unitOrder": "",
    "winner": "",
    "winnerOrder": "",
    "date": "1",
    "score": ""
  }],
  "form_3": [{
    "resultName": "",
    "level": "",
    "unitOrder": "",
    "winner": "",
    "winnerOrder": "",
    "date": "1",
    "score": ""
  }]
}

我尝试在 express 服务器中控制台记录数据:

console.log(req.body)

但出现了错误:

TypeError:无法将对象转换为原始值

我不明白。那么如何获取数据呢?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

此错误背后的实际原因

当 Javascript 尝试将对象转换为字符串时。

Javascript 将尝试调用该对象的toString() 方法。大多数 Javascript 对象都有从Object.prototype 继承的toString() 方法。但其中一些有null prototype,没有toString() 方法,因此Javascript 将无法将这些对象转换为字符串原语。和can't convert object to primitive error will rise

在Javascript中创建一个空原型对象使用这个方法

let travel = Object.create(null);

解决方案

travel = {...travel};

【讨论】:

    【解决方案2】:

    console.log 用于记录字符串或简单值

    正如文档所说,您可以将输出格式化为 json,例如 console.log("body: %j", req.body)

    或者,更好的是,使用 console.dir 按原样记录对象

    【讨论】:

    • @torazaburo 因为 console.log 无法将其转换为要显示的原始值。您尝试过 alebianco 的解决方案吗?
    • 您使用的是哪个版本的节点?
    • @alebianco v 6.5.0
    【解决方案3】:

    检查要点。

    1. 标头类型应为 application/json
    2. 检查json是否字符串化

    角码

     headers.append('Content-Type', 'application/json');
        this.http.post(url, JSON.stringify(body), { headers: headers }).map((data: Response) => data.json()).catch(this.handleError);
    
    1. Cors 在 nodeJs 中的 server.js 中启用 - 表达代码

      var cors = require('cors'); app.use(cors());

    4.现在 api.js(或 somefile.js)中的 req.body 应该有从角度形式传递的 json 数据

    上面是组合对我工作的那个。有些人通过从 angular 发送 json 并尝试在 nodejs 中再次解析 json 对象而面临错误,这会导致错误。

    很少会出现飞行前错误。实际上,浏览器可能首先使用方法 OPTIONS 发送飞行前请求,以获取允许的来源、标头和方法。因此启用 cors 有助于避免此错误。

    【讨论】:

      【解决方案4】:

      通常导致此错误消息的原因是系统尝试将某些对象转换为字符串,但无法从它尝试显示为字符串的对象生成字符串。

      如果一个值不继承 Object 而是一种更原始​​的值类型,因此它不从 Object.prototype 继承 toString() 方法,通常就是这种情况。

      例如

      Object.create(null) + '' 
      

      导致这个错误,因为 + "" 基本上意味着与调用您尝试 + "" 的值的方法 toString() 相同。但是由于 Object.create(null) 没有从 Object.prototype 继承 toString() 方法,这会导致错误。

      同样

      (Object.create(null)) .toString() 
      

      产生同样的错误。

      如果您将自己的方法 toString() 添加到这样的值,则添加的方法必须返回一个字符串,否则您会再次收到相同的错误消息,因为系统随后会调用您的 toString() 方法,但这不会产生细绳。

      所以要小心尝试在日志等中打印出不是对象的值。另一种情况是,如果您使用这样的值调用 alert() 或 confirm() 等。

      【讨论】:

        【解决方案5】:

        一般console.log(req.body),但当你与put打交道时,你最好打出console.log('request body: ',req.body);不要

        【讨论】:

          猜你喜欢
          • 2019-10-16
          • 1970-01-01
          • 1970-01-01
          • 2019-06-13
          • 1970-01-01
          • 2013-01-12
          • 1970-01-01
          • 2018-06-11
          • 1970-01-01
          相关资源
          最近更新 更多