我有一个简单的销售应用程序,在控制器中我查询数据库。检索结果,使用async.each函数对数据进行一些操作,然后将数组发送到视图。
即使我的日志显示数组中的数据,我的视图也会收到一个空白数组。
"index": function(req, res, next) {
Sales.find().sort("createdAt DESC").done(function(err, sales) {
if (err) {
res.send("An error has occured. :(");
} else {
if (!sales) {
req.session.flash = {
err: {
message: "You have no billing as of now.",
style: "alert-info"
}
}
} else {
var bills = [];
async.eachSeries(sales, function(thisSale, callback) {
if (!bills[thisSale.billingNo]) {
bills[thisSale.billingNo] = {
id: thisSale.billingNo,
createdAt: thisSale.createdAt,
total: (thisSale.quantity * thisSale.price),
location: thisSale.location,
};
} else {
bills[thisSale.billingNo].total += (thisSale.quantity * thisSale.price);
}
callback();
}, function(err) {
if (err) {
console.log('Something went wrong !');
exit();
} else {
res.send({
billing: bills
});
console.log("=====\nBILL\n=====\n", bills);
}
});
}
}
});
},
我用res.send替换res.view来调试我的代码,在客户端我只收到这个:
{
"billing": []
}
虽然控制台日志显示:
=====
BILL
=====
[ '53b95fdc1f7a596316f37af0': { id: '53b95fdc1f7a596316f37af0',
createdAt: Sun Jul 06 2014 20:10:28 GMT+0530 (IST),
total: 6497,
location: 'Location A' },
'53b8f7c81f7a596316f37aed': { id: '53b8f7c81f7a596316f37aed',
createdAt: Sun Jul 06 2014 12:46:24 GMT+0530 (IST),
total: 6497,
location: 'Location A' } ]
有人可以帮我弄清楚我做错了什么吗?
答案 0 :(得分:1)
我试图调试这个问题,发现我无法访问账单[0],然后在阵列账单上使用forEach循环,发现它无法为每个循环运行。
在将变量账单从数组更改为对象时,问题已得到修复。
我不完全确定为什么会发生这种情况,或者为什么我在向数组中添加变量时遇到了麻烦,但更改了
var bills = [];
到
var bills = {};
修复了问题。
答案 1 :(得分:1)
也许您来自PHP背景,其中“关联数组”是有效类型?在Javascript中,数组仅用整数索引,例如
bills[0] = "something";
Javascript数组与所有非基本类型对象实例一样,这有点让人感到困惑,因此它们可以添加任意属性:
bills.abc = 123;
bills["some arbitrary string"] = 555;
但是你强烈反对以这种方式使用数组,原因很多,包括:
JSON.stringify()
将忽略非整数索引,这就是您在问题中遇到问题的原因。 Sails(以及许多其他库)使用JSON.stringify()
来序列化Javascript对象以进行传输。length
,push
和pop
,您无法为其分配值。length()
方法不会计算非整数键。{}
声明)的用途!希望这可以解释为什么更改为var bills = {}
会使一切正常。