(To be clear, Im asking this question so as to provide the answer I found in an effort to help others that have been similarly affected by the Parse closure)

Parse.com最近宣布他们将于2017年1月关门,但谢天谢地,他们已经完成了Parse Server software open source,所以我们都可以托管自己的解析服务器实例.

我已经研究了托管解析服务器的各种选项,并决定在Heroku上托管我的解析服务器

我喜欢Parse,因为它很容易使用,而且我没有设置后端的实际经验.我试着在网上阅读了几本指南,但发现它们都有点难以理解,因为有些模糊的步骤或步骤会让你在另一个网站上陷入困境,安装了很多工具,这一切都有点让人困惑.

如何在heroku上托管Parse Server,将其设置为接受来自应用程序的跨域请求,创建MongoDB数据库,并将所有数据从Parse迁移到新数据库?

推荐答案

Self hosting Parse Server on Heroku


设置Heroku、MongoDB和Parse

  1. 访问https://signup.heroku.com/并注册一个帐户
  2. 验证您的邮箱,并登录Heroku
  3. Deploying a Parse Server to Heroku
  4. 单击"部署到Heroku"

enter image description here


  1. 给解析服务器起个名字
  2. 暂时跳过应用程序的app_ID和MASTER_键,我们将在后面的步骤中进行设置.
  3. 单击"免费部署"

enter image description here


  1. 如果出现以下框,请输入您的信用卡信息以验证您的帐户.Dont worry, you wont be charged unless you upgrade your account later.这只是Heroku为防止滥用而采取的安全措施.

enter image description here


  1. Heroku将创建你的应用程序.在背景中,它还将创建一个.git repo,克隆official parse-server-example git repo的内容,创建MongoDB数据库,并将Heroku应用程序配置为使用该数据库.
  2. 当应用程序被创建时,你会被带到它的Heroku仪表板,或者你可以登录,点击"个人应用",然后点击解析服务器的名称
  3. 在应用程序的仪表板上,单击"设置",然后单击"显示配置变量"

enter image description here


  1. 填写应用程序的应用程序ID和主密钥.如果你有一个正在解析的应用程序.com现在,您可以使用它使用的相同密钥.你可以在https://www.parse.com/apps/<APP_NAME>/edit#keys上搜索,其中<APP_NAME>是你的应用程序名.如果你正在创建一个新的应用程序,你可以generate random keys here.你可以为你计划使用的任何sdk添加新的键,我在这里为javascript sdk添加一个.

enter image description here


  1. 请注意MONGOLAB_URI的值,如果您想将现有的解析数据迁移到新的数据库中,您将需要这个值
  2. 向下滚动并记下你的应用程序的Git Url和Heroku域,你以后需要这些

enter image description here


  1. 安装Heroku Toolbelt,这是一个用于管理Heroku应用程序的命令行界面工具.

  2. 打开终端提示,输入$ heroku login,输入Heroku邮箱和密码

  3. 输入$ heroku git:clone -a <MY_APP_NAME>(其中<MY_APP_NAME>是heroku应用程序的名称)以制作服务器代码repo的本地副本,您还可以使用我们之前看到的git url.克隆回购协议时,您将看到消息"警告:您似乎克隆了一个空存储库.".将创建应用程序文件夹,但它只包含标准git文件,不包含解析服务器.来解决这个问题.转到official parse-server-example git repo,下载回购协议的zip file.提取文件夹,将所有文件和文件夹从parse server example主文件夹拖到应用程序文件夹中.

  4. 回到终端,输入$ cd <MY_APP_NAME>进入回购

启用CORS(以便可以使用其他域的API)

  1. 在硬盘上,找到并打开我们刚刚创建的回购协议的本地副本
  2. 在文件夹中,打开package.json并将"cors": "*"添加到dependencies,如下所示:

.

  "dependencies": {
    "express": "~4.2.x",
    "kerberos": "~0.0.x",
    "parse": "~1.6.12",
    "parse-server": "~2.0",    // <= don't forget this comma
    "cors": "*"                // add this line
  }

笔记

确保在实际代码中删除上述注释,因为它不是有效的JSON

  1. 打开index.js并进行以下更改:

.

var express = require('express');  // find this line in the file
var cors = require('cors') // add this line below it

//....


//var databaseUri = process.env.DATABASE_URI || process.env.MONGOLAB_URI // old name, you may need to change this for new deployments
var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI  // changed to MONGODB_URI in Heroku!

//....

var app = express();  // find this line in the file
app.use(cors()); // add this line below it

//Add declarations for any keys you plan to use as shown below
var api = new ParseServer({
  databaseURI: databaseUri || 'mongodb://localhost:27017/dev',
  cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
  appId: process.env.APP_ID || 'myAppId',
  masterKey: process.env.MASTER_KEY || '',
  serverURL: process.env.SERVER_URL || 'http://localhost:1337',
  javascriptKey: process.env.JAVASCRIPT_KEY || '',  //** add this line no need to set values, they will be overwritten by heroku config vars
  restAPIKey: process.env.REST_API_KEY || '', //** add this line
  dotNetKey: process.env.DOT_NET_KEY || '', //** add this line
  clientKey: process.env.CLIENT_KEY || '', //** add this line
});
  1. 返回终端窗口,确保您仍在我们克隆的回购协议的文件夹中,并输入以下内容以将更改推送到Heroku:

.

$ git add .
$ git commit -am "make it better"
$ git push heroku master

测试你的新解析服务器

  1. go 这jsFiddle page
  2. 将fiddle中的<MY_APP_ID><MY_JS_KEY><MY_HEROKU_APP_NAME>更改为应用程序的相应值,然后单击"运行"

.

Parse.initialize('<MY_APP_ID>', '<MY_JS_KEY>');
Parse.serverURL = 'https://<MY_HEROKU_APP_NAME>.herokuapp.com/Parse'
  1. 您应该会收到以下alert ,告知您的新解析服务器工作正常

enter image description here

笔记:

如果将JSFIDLE工具用于多个解析服务器实例,可能会出现错误"会话令牌无效".如果发生这种情况,请打开dev控制台,并从本地存储中删除所有"parse"键,然后,它应该可以工作:

enter image description here


从Parse迁移现有数据

在迁移生产应用程序之前,您应该在测试应用程序中至少执行一次.此外,您的旧应用程序中的legacy files可能尚未传输,请参见this GitHub Issue

  1. Before we migrate,如果新的MongoDB中有数据,迁移将失败.如果您刚刚测试了服务器并创建了对象,请转到https://dashboard.heroku.com/apps/<MY_HEROKU_APP_NAME>/resources,单击其图标旁边的"MongoLab",然后在下一页上单击"删除所有集合"
  2. 转到https://dashboard.parse.com/apps/<APP_NAME>/settings/general,其中<APP_NAME>parse应用程序的名称
  3. 向下滚动页面并单击"迁移"
  4. 在模式中,在灰色区域(看起来不太像输入…)输入我们之前记录的MONGOLAB_URI
  5. 单击"开始迁移"

enter image description here


  1. 迁移完成后,单击"Finalize",然后在弹出窗口中单击"Okay",迁移完成后,所有数据都将保存在新的MongoDB数据库中.

enter image description here


  1. 目前,您的分析仪表板将继续显示您现在位于新数据库中的数据.要测试所有内容,请返回我们之前使用的测试JSFIDLE并再次运行它.现在,转到Parse仪表板,您应该会看到新添加的类和行.Note当我使用新的解析仪表板时,我可以看到行数,但行区域都是空白的.我又回到了旧的分析仪表板,可以看到一切都很好.

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

如何在MongoDB中使用Aggregation来计算两个键相同但字段不同的对象数组的总值,并将其合并为一个?

如何在MongoSH中的现有文档中插入字段

如何在Mongo中制作全覆盖索引

带dropTarget的MongoDB renameCollection命令是原子的吗

mongoose正在抛出Schema的错误has';t已在next.js中注册

如何在 mongodb 查找的外键中使用正则表达式

我可以在 MongoDB 中将字段值设置为对象键吗?

在延迟函数中重用 context.WithTimeout

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

如何使用 mongoexport 导出排序数据?

如何知道 MongoDB 集合大小?

如何使用原子操作在一个文档中切换布尔字段?

使用 mongoimport 将日期(ISODate)导入 MongoDB

如何对连接到 mongo 的方法进行单元测试,而不实际连接到 mongo?

如何在mongoose中加入两个集合

MongoDB GridFS VS 直接磁盘 IO

MongoDB:如何在 100 个集合中找到 10 个随机文档?

一起使用 MongoDB 和 Neo4j

MongoDb:聚合 $lookup 过滤外部文档