Ionic + Phonegap - 添加授权的离线数据库

Posted

技术标签:

【中文标题】Ionic + Phonegap - 添加授权的离线数据库【英文标题】:Ionic + Phonegap - add offline database with authorization 【发布时间】:2016-06-26 20:34:45 【问题描述】:

我最近使用 ionic 框架(也使用 phonegap android/ios)制作了简单的应用程序。我需要在数据库中存储一些用户数据。我发现了 firebase 并将其成功集成到我的应用程序中。我让用户匿名或通过谷歌登录。在我的情况下,每个用户都应该只看到他的内容,所以我添加了规则——它们起作用了。但是,我的应用程序需要在没有互联网连接的情况下在移动平台(android/ios)上运行,并且 firebase 没有在 javascript 中提供完整的离线存储(仅临时)(持久存储目前仅在本机中实现)。所以基本上我碰壁了。我听说过 CouchDB/PouchDB,它确实支持离线存储并与远程服务器同步。我在 cloudant 上创建了一个帐户,但后来我记得我需要用户授权——正如我所说的,用户只需要拥有自己的数据。因此,假设客人只有本地数据库,而使用谷歌登录的用户在远程服务器上也有数据库,因此他可以切换设备并使用相同的(他自己的)数据。但我在 CouchDB (cloudant) 中找不到这样的工具。是否有任何其他解决方案可以顺利地与离子一起使用并提供:

离线数据库, 谷歌授权, 授权成功后远程数据库同步(与本地数据库), 远程数据库托管在某些服务器上(可能需要付费,但需要试用) - 我不想担心服务器 - 仅限客户端

?

TL;DR:我正在寻找一个在 ionic/angularjs/cordova 上使用远程数据库 + 本地数据库以及它们之间的同步的托管服务。

【问题讨论】:

【参考方案1】:

使用 MongoDB 有什么问题,到目前为止,使用 npm mongoose 与 Express/Node.js 集成是最容易的。它是一种非常流行且非常好的存储数据的方式,它类似于 firebase。 例如:

var Express = require('express'),
app = Express.router();
app.route('/api/auth/signup').post(users.signup);

架构示例:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema

var UserSchema = new Schema(
  firstName: 
    type: String,
    trim: true,
    default: '',
    required: 'Please fill in your first name'//message given if you fail to provide the required field.
  ,
  lastName: 
    type: String,
    trim: true,
    default: '',
    required: 'Please fill in your last name'
  ,
  displayName: 
    type: String,
    trim: true
  ,
  email: 
    type: String,
    unique: 'Email already exists. Sign In?',
    lowercase: true,
    trim: true,
    default: '',
    validate: [validateLocalStrategyEmail, 'Please fill a valid email address'],//create a custom Email Validation strategy
    required: 'Please enter a valid business Email'
  ,
);

样品控制器:

exports.signup = function (req, res) 
  // For security measurement we remove the roles from the req.body object
  delete req.body.roles;

  // Init user and add missing fields
  var user = new User(req.body);
  user.provider = 'local';
  user.displayName = user.firstName + ' ' + user.lastName;

  // Then save the user
  user.save(function (err) 
    if (err) 
      return res.status(400).send(
        message: errorHandler.getErrorMessage(err)
      );
     else 
      // Remove sensitive data before login
      user.password = undefined;
      user.salt = undefined;

      var jwtToken = authentication.signToken(user);
      res.json( user: user, token: jwtToken );
    
  );
;

您可以在 MEAN.js Github 上找到其中的一些内容。 但是你必须使用 LocalStorage。如果您希望它在 iPad/iPhone 上运行,您的 ionic 应用程序的 JSON Web 令牌。

【讨论】:

感谢您的回答!这是否意味着我也必须创建服务器端(设置数据库、授权)?我不知道 express 并且从未使用过 mongoDB,这就是我问的原因。 是的,不幸的是,如果您想在数据库中本地存储内容,我发现不太可能->如果没有相当简单的服务器,您将无法做到这一点。 Node.js 是简单服务器的绝佳选择。我认为您可以查找简单的 Mongoose 示例,但您知道您基本上必须获取密码、电子邮件并使用 $http.post('/api/auth/signup', email: $scope.field 将它们发送到某个 URL .email, password: $scope.field.password) 然后 Express.router() 将在 /api/auth/signup 路由上接受它,它将在 req(req 是 request 的缩写)req.body 中可用; 【参考方案2】:

最好的办法是使用PouchDB,它适用于本地存储(适用于 ionic/cordova),只需几行代码即可同步到远程 couchdb 服务器:

var localDB = new PouchDB('mylocaldb');
var remoteDB = new PouchDB('http://localhost:5984/myremotedb');
localDB.sync(remoteDB);

唯一棘手的一点是带有身份验证的远程服务器。 CouchDB 可以开箱即用地处理 oauth,但在每个数据库的情况下,这意味着您需要为每个用户创建一个数据库,这是许多人所做的,但这涉及很多。发送search for CouchDB on npmjs.com 看看会发生什么。

或者,您可以将 CouchDB 封装在 Express 等节点服务器后面,并在传递请求之前在 Express 中处理身份验证。

这不是一件容易的事,而且一旦您开始积累使用量,Firebase 就会收取一笔不小的费用,这是有原因的。如果您对服务器端的东西不感兴趣,更简单的方法可能是使用meteor 或hoodie。

【讨论】:

以上是关于Ionic + Phonegap - 添加授权的离线数据库的主要内容,如果未能解决你的问题,请参考以下文章

phonegap+cordova+ionic调用原生API

Ionic / Angular 离子项,带有按钮单击以选择隐藏选定的离子项

离子 - 添加/删除 phonegap-push-plugin - CocoaPods 未找到

使用 Ionic 项目添加远程 git 存储库的授权错误

phonegap build + phonegap-cli + ionic 图标

使用 Cordova/PhoneGap/Ionic 存储数据的方法都有哪些?