我正在尝试确定集合中是否存在文档(作为对象数组的一部分接收)。如果它不存在,我希望插入文档并在对象中添加“unread = true”。
以上咖啡脚本中的代码如下:
updateEvents = (db, events, done) ->
async.each events, (eventobj, cb) ->
# check whether event exists in event collection
db.Event.count eventobj, (err, count) ->
# if it doesn't
if count is 0
# insert the document and when finished set an unread property on this object to true
db.Event.insert eventobj, (err) ->
eventobj.unread = true
# if it does, log that is was found
else
console.log "yep, found it"
# pass results back up chain to client
done null, events
在分配后控制台记录时,eventobj上会显示未读属性,但是,当传递给客户端时,它不会保留。就好像任务从未发生过一样。为什么会这样?
这与类型错误问题不同,因为它涉及数据流问题,而不是任何类型的错误。
答案 0 :(得分:0)
您应该在unread
操作之前将true
设置为insert
。
eventobj.unread = true
db.Event.insert eventobj, (err) ->
// error handling
而不是在回调函数中设置unread
。当您在回调函数中设置它时,eventobj
已经保存到db中,只需更改eventobj
本身。
答案 1 :(得分:0)
正如zangw所说,你应该在插入 if 之前设置属性,你想要在db中保存未读属性。我从你的问题中得到的是你只想返回events数组,其中一个未读属性附加到db中不存在的每个对象。在任何一种情况下,您都应该更新要返回的实际事件数组。 而不是:
eventobj.unread = true
执行:
var index = events.indexOf(eventobj);
if (index !== -1) {
events[index].unread = true;
}
答案 2 :(得分:0)
解决。问题是async.each在调用完成回调时没有完成执行。我将完成的回调放入一个匿名函数,并将其作为async.each函数的可选回调附加。
updateEvents = (db, events, done) ->
async.each events, ((eventobj, cb) ->
# check each event to see if it exists in users collection
db.Event.count eventobj, (err, count) ->
# if it doesn't
if count is 0
# # insert the document and when finished set an unread property on this object to true
db.Event.insert eventobj
eventobj.unread = true
cb()
# if it does, log that is was found
else
console.log "yep, found it"
cb()
# pass results back up chain to client
), finished = -> done null, events