因此,我将NeDB用作一个简单的小项目的数据存储,我想创建一个小API,该API会插入一些新内容并返回数据存储中所有项目的列表,包括新项目。
async function willAddNewItem() {
// db is NeDB Datastore
const existing = db.getAllData();
const sortedIds = existing
.map(item => item.id)
.sort((one, another) => one - another);
const id = sortedIds.length === 0
? 0
: sortedIds.slice(-1)[0] + 1;
const newItem = { id, foo: 'bar' };
await new Promise(resolve => db.insert(newItem, () => resolve()));
return db.getAllData()
.sort((one, another) =>
new Date(one.updatedAt).getTime() - new Date(another.updatedAt).getTime()
);
}
但是,每次调用此函数时,我都会获得之前插入新项目的列表。在下一个通话中,我上次添加的项目将在其中,但新项目将不存在。刷新我的页面(这将导致再次调用db.getAllData()
来填充初始页面)显示了它应有的一切。它只是在插入后立即丢失的。因此,看来db.insert
上的回调实际上并没有等到插入完成为止(也没有关于此的任何文档)。
在id
上添加索引可以解决此问题,我确实希望在id
上使用索引,因此很好,但是我仍然想知道为什么会这样/在将来我必须要小心的地方。为此,我有点担心,将索引添加到id
起作用的唯一原因是因为它碰巧快了一点,所以在我打电话给db.getAllData()
之前,它已经“完成”了以前没有,而且可能不一致。
我可以使用类似的东西
const afterAdding = await new Promise(resolve =>
db.insert(newItem, (_, newDoc) => resolve([...existing, newDoc]))
);
并返回已排序的afterAdding
,但这对我来说似乎有点怀疑(我很想确切地获得数据库的状态,而不是自己尝试“重新创建”它的状态,并假设insert
已经完全做到了,而且仅达到了我的预期),无论如何,我想进一步了解NeDB在这里的工作方式。
而且,是的,我知道我忽略了插入中的可能错误(我已经检查了这是否是原因;不是),而且我可能根本不想.getAllData()
,但而不是一些.find
查询。这是我熟悉的NeDB的基本测试用例。