我希望能够跨应用程序重用某些功能。在这种情况下,我正在尝试为MongoDb创建一个包装器。所以我创建了以下类:
/** MongoDb
* Parms
* apiKey - This is the api key of the account being used
* dbName - This is the name of the database we are connecting to
*/
function MongoDb(apiKey, dbName) {
this.dbName = dbName;
this.baseUrl = "https://api.mongolab.com/api/1/databases/"+this.dbName;
this.options = {
"contentType":"application/json",
"method":"get" // default
};
this.apiKey = "apiKey="+apiKey;
}
MongoDb.prototype = {
constructor: MongoDb,
getCollections: function(dbName) {
var url = this.baseUrl + "/collections?" + this.apiKey;
var response = UrlFetchApp.fetch(url, this.options);
return JSON.parse(response.getContentText());
}
}
然后我创建了以下函数来测试它:
function test() {
var db = new MongoDb("xxxxxxxxx", "yyyyyyy");
}
这完全符合预期。所以考虑到成功,我把它移到了自己的库中,现在我的测试脚本给了我错误:TypeError: Imported script is not a function, it is object. (line 2, file "MongoTest")
我无法让其他人在我的搜索中收到此错误。
这是不受支持的,还是我应该采取另一种方式?
答案 0 :(得分:3)
当您将库导入脚本时,您必须为其命名,默认情况下它是库自己的名称。所以,如果你命名了图书馆" MonboDb"你应该这样做:
function test() {
var db = new MongoDb.MongoDb("xxxxxxxxx", "yyyyyyy");
}
只是为了澄清一下,你可以将这个库(在脚本中导入时)命名为" Lib",然后你就可以了:
function test() {
var db = new Lib.MongoDb("xxxxxxxxx", "yyyyyyy");
}
结论,将任何代码移动到库中会添加一个新的"命名空间"到代码。这是正确和预期的行为。