为什么express.js在使用res.send()时会返回一个空数组?

时间:2015-03-11 18:24:14

标签: node.js express

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

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的内容,而不仅仅是&#34; []&#34;。

如果我将代码更改为res.send(&#39; string&#39;),我会得到以下内容:

< 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

7 个答案:

答案 0 :(得分:10)

我有同样的问题,填充的“对象”作为空数组返回,尽管与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 }

答案 1 :(得分:4)

尝试使用

发送
res.json(myObject)

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

答案 2 :(得分:3)

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

res.send([机构])

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

res.json([机构])

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

请参阅此答案:Why does a string index in a javascript array not increase the length size?

  

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

     

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

e.g。使用

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

答案 6 :(得分:0)

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

  

错误: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");
})