【发布时间】:2018-11-07 05:26:48
【问题描述】:
伙计们!
我正在开发一个类似于https://airtasker.com 的应用程序,用户将任务外包。 任务者将对任务出价,并等待用户批准他们的出价。
这些是涉及的集合:
- 任务
- 交易
- 出价
基本上,这个函数应该:
检查是否存在具有给定 taskId 的事务。 如果用户开始批准出价,则添加交易。我允许多个任务者完成任务。
如果交易不存在,它应该 添加一个新的,如果达到所需的人力,则将状态标记为正在进行(否则为待处理),并更新投标集合以将投标标记为已接受。
如果交易存在,它应该 检查事务集合中的当前批准列表是否等于人力
如果还没有达到配额人力,推送一个新的任务者并访问投标集合以标记投标接受。
如果在最后一个条件之后,批准的列表已经达到配额人力,则标记任务关闭,并将交易状态更改为进行中
但我不断收到此错误:
Uncaught (in promise) 错误:事务中读取的每个文档也必须写入。 在 Transaction.commit (transaction.js:128) 在 eval (sync_engine.js:244)
这是我的代码:
const acceptOffer = async (taskerId, taskId, bidId, offer) => {
let bulk
try {
const taskRef = db.collection('tasks').doc(taskId)
const transRef = db.collection('transactions').doc(taskId)
const bidRef = db.collection('bids').doc(bidId)
const fees = solveFees(offer)
bulk = await db
.runTransaction(async t => {
const transdoc = await t.get(transRef)
const taskdoc = await t.get(taskRef)
const manpower = await taskdoc.get('manpower')
let status = 'pending'
if (manpower === 1) {
status = 'ongoing'
}
if (!transdoc.exists) {
t.set(transRef, {
taskId,
status, // pending, ongoing, completed
approved: [
{ taskerId, ...fees }
]
})
t.update(bidRef, {
accepted: true
})
} else {
const approved = await transdoc.get('approved')
if (manpower < approved.length) {
approved.push({ taskerId, ...fees })
t.update(transRef, { approved })
t.update(bidRef, { accepted: true })
if (manpower === approved.length) {
t.update(taskRef, { open: false })
t.update(transRef, { status: 'ongoing' })
}
}
}
})
} catch (e) {
bulk = e
console.log('nag error', e)
throw e
}
if (bulk.success) {
swal('Offer accepted!', '', 'success')
} else {
swal('Oh, no!',
'This task might already be approved',
'error'
)
}
}
我一直被困在这里,因为我不明白交易失败的地方。很感谢任何形式的帮助。
谢谢!
【问题讨论】:
标签: javascript firebase ecmascript-6 async-await google-cloud-firestore