【问题标题】:Cloudkit JS && Node JSCloudkit JS && 节点 JS
【发布时间】:2015-09-06 09:36:55
【问题描述】:

我目前正在尝试使用 Apple 的新 CloudKit JS 执行与 iCloud 服务器的服务器端连接。根据 WWDC 2015“CloudKit JS 和 Web 服务”,由于 CloudKit JS 是一个纯 JS 框架,您可以在所有 JS 环境中使用它,例如 node JS。

我从https://cdn.apple-cloudkit.com/ck/1/cloudkit.js复制了CloudKit JS的源代码并将其粘贴到一个名为“cloudkit.js”的文件中。这是我尝试过的演示:

var CloudKit = require("/some/folders/cloudkit.js")

function demoPerformQuery() {
  CloudKit.configure({
      containers: [{
    containerIdentifier: 'myContainerIdentifier',
    apiToken: 'myAPIToken',
    environment: 'development'
      }]
    })

  var container = CloudKit.getDefaultContainer();
  var publicDB = container.publicCloudDatabase;

  publicDB.performQuery({recordType: 'Items'}).then(function(response){
    // never called :-(
  })
}

var express = require('express')

var app = express()

app.get("/", function(){
  demoPerformQuery()
})

var server = app.listen(8080, function () {
  console.log("server launched")
})

CloudKit 似乎设置正确,因为所有函数都被正确调用。但是 performQuery 的回调永远不会被调用。为什么 ?

是否有人已经成功在服务器环境中配置 CloudKit JS ?

提前致谢

【问题讨论】:

    标签: javascript ios node.js cloudkit cloudkit-web-services


    【解决方案1】:

    在浏览器中,CloudKit.js 依赖 XmlHttpRequest 来获取资源,但由于 CloudKit 不是 npm 模块,因此您需要一种从服务器获取内容的方法。

    npm install node-fetch

    使用 node-fetch,这里是您的代码的调整版本,用于在您的查询中记录生成的项目:

    var fetch = require('node-fetch');
    var CloudKit = require("./cloudkit.js")
    
    CloudKit.configure({
      services: {
        fetch: fetch
      },
      containers: [{
        containerIdentifier: 'yourContainerIdentifier',
        apiToken: 'yourAPItoken',
        environment: 'development'
      }]
    })
    
    var container = CloudKit.getDefaultContainer();
    var publicDB = container.publicCloudDatabase;
    
    function demoPerformQuery() {
      publicDB.performQuery({recordType: 'Items'}).then(function(response){
        console.log(response)
      }).catch(function(error){
        console.log(error)
      })
    }
    
    var express = require('express')
    var app = express()
    
    app.get("/", function() {
      demoPerformQuery()
    })
    
    var server = app.listen(8080, function () {
      console.log("Server listen")
    })
    

    点击http://localhost:8080 后,您应该会看到您的服务器记录了对您的查询的响应。

    【讨论】:

    • 感谢您的回复。我收到一个错误:“缺少本机承诺,请将 Fetch.Promise 设置为您最喜欢的替代方案”。这种方法对你有用吗?
    • Promise 从 0.11 版本开始在节点中可用(当前版本为 0.12)。您可以升级节点或使用 github.com/jakearchibald/es6-promise 之类的东西作为回填。
    • 像魅力一样工作!非常感谢。
    • var fetch = require('node-fetch'); fetch.Promise = require('es6-promise').Promise;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多