脚本注意事项
数据库查询结果不能在以下上下文中传递
类构造函数
非异步生成器函数
回调函数
.sort()
对数组进行排序类中的 JavaScript 设置器
要访问数据库调用的结果,请使用异步函数、异步生成器函数,或者 .map()
。
构造函数
以下构造函数无效
// This code will fail class FindResults { constructor() { this.value = db.students.find(); } } // This code will fail function listEntries() { return db.students.find(); } class FindResults { constructor() { this.value = listEntries(); } }
请使用 async
函数替代
class FindResults { constructor() { this.value = ( async() => { return db.students.find(); } )(); } }
注意
您还可以创建一个方法,在类中执行数据库操作,作为使用异步 JavaScript 的一种替代方法。
class FindResults { constructor() { } init() { this.value = db.students.find(); } }
要使用此类,首先构建一个类实例,然后调用 .init()
方法。
生成器函数
以下生成器函数不工作
// This code will fail function* FindResults() { yield db.students.findOne(); } // This code will fail function listEntries() { return db.students.findOne(); } function* findResults() { yield listEntries(); }
请使用 async generator function
代替。
function listEntries() { return db.students.findOne(); } async function* findResults() { yield listEntries(); }
数组排序
以下数组排序不工作
// This code will fail db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => { return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() ) } );
请使用 .map()
代替。
db.getCollectionNames().map( collectionName => { return { collectionName, size: db[ collectionName ].estimatedDocumentCount() }; } ).sort( ( collectionOne, collectionTwo ) => { return collectionOne.size - collectionTwo.size; } ).map( collection => collection.collectionName);
这种方法通常比等效的不支持代码更高效。
JavaScript 设置器
以下 JavaScript 设置器不工作
// This code will fail class TestClass { value = 1; get property() { return this.value; } // does not work: set property(value) { this.value = db.test.findOne({ value }); } }