【问题标题】:Why does express.js return an empty array when using res.send()?为什么 express.js 在使用 res.send() 时返回一个空数组?
【发布时间】:2015-03-11 18:24:13
【问题描述】:

我有一个包含键值对数组的对象。

console.log(myObject);

[ 'askdasuni.com': '11111',
  'capsfrom2011.com': '22222',
  'defusionet.com': '33333' ]

当我在我的应用程序中调用 res.send(myObject) 时,我得到以下信息:

< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
< Content-Length: 2
< Date: Wed, 11 Mar 2015 18:15:41 GMT
< Connection: keep-alive
[]

我希望它发送 myObject 的内容,而不仅仅是“[]”。

如果我将代码改为 res.send('string'),我会得到以下信息:

< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 6
< Date: Wed, 11 Mar 2015 18:21:09 GMT
< Connection: keep-alive
< 
string

【问题讨论】:

  • 发布一些代码,我猜你可能正在调用一个没有回调的函数发送一个空对象。
  • 不确定是否是拼写错误,但您列为数组的内容甚至无效。
  • 我也面临同样的问题。你有解决办法吗?

标签: node.js express


【解决方案1】:

我遇到了同样的问题,尽管使用 console.log 很好地显示了一个填充的“对象”,但它作为一个空数组返回。

查看后发现其实是初始化了一个数组,然后当做对象使用:

var myObject = [ ]
myObject['...'] = ...
...
res.send(myObject)

=> [ ]

结果变量最好描述为“具有属性的空数组”而不是对象,因此res.send()没有返回这些值>.

解决方案 1

使用花括号将变量初始化为对象:

var myObject = { }      <----- curly braces
myObject['...'] = ...
...
res.send(myObject)

=> { x : object-x, y : object-y, z : object-z }

解决方案 2

在返回之前将结果转换为对象,如下:

var myObject = [ ]
myObject['...'] = ...
...
var myObject = [ ]
let obj = { }
for (var key in myObject) {
  obj[key] = myObject[key]
}
res.send(obj)

=> { x : object-x, y : object-y, z : object-z }

【讨论】:

  • 怎么没人投票这个
【解决方案2】:

尝试发送

res.json(myObject)

res.json 确保响应将具有 utf8 字符集和 application/json 内容类型

【讨论】:

    【解决方案3】:

    不要与res.json([body])res.jsonp([body])res.send([body]) 混淆,它们各不相同,在需要时使用。

    res.send([正文])

    发送 HTTP 响应。 body 参数可以是 Buffer 对象、String、对象或 Array。

    res.json([body])

    发送 JSON 响应。此方法与 res.send() 相同,以对象或数组作为参数。但是,您可以使用它将其他值转换为 JSON,例如 null 和 undefined。 (虽然这些在技术上不是有效的 JSON)

    因此,如果您严格想要发送 JSON 响应,最好使用 res.json(..)

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题。虽然我可以控制台记录数据,但响应将为空。在发送响应之前,我发现 Promise 没有得到解决。所以我在异步函数上调用了 .then 并从内部返回响应然后调用。这为我解决了这个问题。代码如下所示。

      router.get('/',(req,res) => {
          res.setHeader('Content-Type', 'application/json');
          getParallel().then(obj=>{res.json(obj);res.end()})
      })
      

      【讨论】:

        【解决方案5】:

        您需要将对象包装在大括号中,而不是方括号中,因为您将其作为对象而不是数组发送。在 javascript 中,键值对必须用大括号括起来。

        【讨论】:

          【解决方案6】:

          看到这个答案:Why does a string index in a javascript array not increase the length size?

          Javascript 数组不能有“字符串索引”。一个 Javascript 数组是 专门用数字索引。当你设置一个“字符串索引”时,你是 设置对象的属性。这些是等价的:

          array.a = 'foo';数组['a'] = 'foo';这些属性不属于 数组的“数据存储”。

          例如使用

          { 'askdasuni.com': '11111',
            'capsfrom2011.com': '22222',
            'defusionet.com': '33333' }
          

          【讨论】:

            【解决方案7】:

            我没有从控制台收到任何消息,得到错误“

            错误:createError 时出现网络错误"

            来自 Axios 的回应。然后我认为这是由 CORS 引起的。通过添加以下代码解决了这个问题:

            app.use(function(req,res,next){
                res.header("Access-Control-Allow-Origin","*");
                res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Content- 
                    Type,Accept");
                res.header("Access-Control-Allow-Methods","PUT,GET,POST,DELETE,OPTIONS");
            })
            

            【讨论】:

              猜你喜欢
              • 2022-01-06
              • 2012-08-26
              • 1970-01-01
              • 2015-09-04
              • 2015-03-18
              • 2021-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多