这里有两件事可能会令人困惑。
首先,arangojs(与 ArangoDB 的内部 JS API 不同)对于需要与实际 ArangoDB 服务器通信的所有内容都是异步的。异步函数在文档中被标记为“异步”。
您可以将 node.js 样式的回调(如内置 node.js 模块中的异步函数,例如fs
,http
等)传递给这些方法。或者,您可以简单地省略回调,该方法将返回结果的承诺。您可以在 Mozilla 的 JavaScript 参考文档中了解有关 Promise 工作原理的更多信息(这不是特定于 Mozilla 的——它们的参考非常好并且通常是正确的)。
您遇到的另一件事是 arangojs 中的集合对象与 ArangoDB 中的实际集合之间的区别。驱动程序允许您为集合创建集合对象,无论它们是否存在。如果集合实际上不存在,则尝试使用它们时,您当然会看到错误。
var col = db.collection('whatever');
col.create() // create the collection if it doesn't exist
.catch(function () {}) // ignore any errors
.then(function () {
return col.get(); // make sure the collection exists now
})
.then(function () {
return col.save({some: 'data'});
})
.then(function (result) {
// everything went fine
})
.catch(function (e) {
console.error('Something went wrong', e.stack);
});
或使用 async/await (如果您使用 Babel 或一年后阅读此答案):
var col = db.collection('whatever');
try {
await col.create(); // create the collection if it doesn't exist
} catch (e) {} // ignore any errors
try {
await col.get(); // make sure the collection exists now
const result = await col.save({some: 'data'});
// everything went fine
} catch (e) {
console.error('Something went wrong', e.stack);
}
或者使用 node.js 风格的回调,因为你是老派或者真的很喜欢金字塔:
var col = db.collection('whatever');
col.create(function () { // create the collection if it doesn't exist
// ignore any errors
col.get(function (err) { // make sure the collection exists now
if (err) {
console.error('Something went wrong', err.stack);
return;
}
col.save({some: 'data'}, function (err, result) {
if (err) {
console.error('Something went wrong', err.stack);
return;
}
// everything went fine
});
});
});