我正在为我使用 Meteor
构建的 iOS 和网络应用程序实现离线模式。
到目前为止,在线模式使用 API,我使用 HTTP
包保存和获取所有数据。
现在,我已经开始使用此解决方案设置本地数据库以在应用程序离线时保存数据:Link
所以现在,我可以让我的网络应用程序使用 API,让我的移动应用程序在本地保存数据,但我找不到一种好的方法来让一段代码同时适用于这两者。
这是我的代码:
1 - 我在哪里调用我的方法
Meteor.call('createDocument', myDataToSave, function( error, result)
{
console.log(error, result);
});
2 - 我的方法:
// First option
if( Meteor.isServer){
Meteor.methods({
createDocument: function( myDataToSave){
console.log('is server2');
return HTTP.post( API_URL, {
data: myDataToSave
});
}
});
}
// Second option
Meteor.methods({
createDocument: function(myDataToSave {
if (Meteor.isCordova) {
alert('is cordova');
return Documents.insert(myDataToSave);
} else if( Meteor.isServer){
console.log('is server');
return HTTP.post( API_URL, {
data: myDataToSave
});
} else {
console.log(Meteor);
}
}
});
所以现在我不明白的是,当我在我的网络浏览器上本地测试应用程序时,如果我使用第二个选项(注释掉第一个),我的日志中有 Meteor. isClient
为 true
,因为使用了最后一个 else
。
如果我使用第一个选项并注释掉第二个选项,一切正常,Meteor.isServer
为 true
,因此我可以将数据保存到 API
所以我想我的问题是,如何在同一个文件中以同样的方式调用它,Meteor
返回不同的环境?它来自于在 Meteor.isServer
内部或外部声明 Metor.methods
吗?
PS:我找到了同时使用两者的解决方案,即有两种不同的方法,一种用于server
,一种用于client
:
if (Meteor.isCordova) {
var method = 'createDocumentClient';
} else {
var method = 'createDocument';
}
Meteor.call(method, myDataToSave, function( error, result)
{
console.log(error, result);
});
但即使这个解决方案似乎有效,我仍然不知道为什么它有效而第一个选项无效,如果有人能帮助我理解正在发生的事情,我将不胜感激:)
最佳答案
假设您的代码位于根目录或 /lib
中,该方法将首先在客户端上运行,然后在服务器上运行。这样做是为了延迟补偿,在客户端上称为模拟。 .isServer
和 .isClient
让您可以控制您希望代码运行的环境。
如果您将方法放在 /client
中,那么它们将仅在客户端上运行,反之亦然,如果您将它们放在 /server
中。
通过新的 ES6 导入,您可以具体控制导入到每个环境中的内容。
关于javascript - 调用方法时 Meteor.isClient 与 isServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800410/