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 - 添加授权的离线数据库的主要内容,如果未能解决你的问题,请参考以下文章
Ionic / Angular 离子项,带有按钮单击以选择隐藏选定的离子项
离子 - 添加/删除 phonegap-push-plugin - CocoaPods 未找到