当前位置: 首页 > 知识库问答 >
问题:

iOS Firebase Flashlight/ElasticSearch Heroku使用node.js设置

甘骞尧
2023-03-14
Firebase Project_ID is- sneakersearch-az12 
Firebase Web_API_Key is- abc123XYZ000...
Firebase App_Url is- gs://sneakersearch-az12.appspot.com
1.Install and run ElasticSearch or add Bonsai service via Heroku
2.git clone https://github.com/firebase/flashlight
3.npm install
4. edit config.js (see comments at the top, you must set FB_URL and FB_SERVICEACCOUNT at a minimum)
5.node app.js (run the app)
6.curl -X POST http://localhost:9200/firebase
7.cd flashlight
8.heroku login

8.登录Heroku

9.heroku create (add heroku to project)

9A-问题:当我第一次在Heroku建立帐户时,我应该用我的应用程序的名字创建一个新的应用程序,并使用它列出的git指令部署它吗?如果我一开始不应该这样做,运行“heroku create”会为我管理这个过程吗?

问题:我是只运行“Heroku create”还是运行“Heroku Create-app's name-here”?

10.heroku addons:add bonsai (install bonsai)
11.heroku config (check bonsai instance info and copy your new BONSAI_URL - you will need it later)
12.heroku config:set FB_NAME=<instance> FB_TOKEN="<token>" (declare environment variables)
13.git add config.js (update)
git commit -m "configure bonsai"

13.提交消息

14.git push heroku master (deploy to heroku)

14.推给主人

15.heroku ps:scale worker=1 (start dyno worker)

15.--问:这是干什么用的?

共有1个答案

澹台新知
2023-03-14

这是一个2部分的答案,其中第1部分回顾了Github的说明,并在步骤19结束。第2部分扩展了第1部分无法容纳的更多信息,它将从第19步开始详细介绍。我得把它加到另一个问题上,并把它链接到这个。

下面是按顺序列出的github步骤。注意一下,我保持了原始步骤与原始Github Author列出的步骤一致,但在下面,我在每个步骤下都放了一堆子步骤,并给出了详细的解释和说明。

假设您已经创建了FireBase项目并获得了GoogleService-Info.plist文件

-FB_NAME is the same thing as your PROJECT_ID
-FB_URL is the same thing as your DATABASE_URL
-FB_TOKEN is the same thing as your API_KEY

So 

-if your PROJECT_ID is "sneakersearch-az12" then your FB_NAME is "sneakersearch-az12"
-if your DATABASE_URL is "https://sneakersearch-az12.firebaseio.com" then your FB_URL is "https://sneakersearch-az12.firebaseio.com"
-if your API_KEY is "0012abc789xyz00019" then your FB_TOKEN is "0012abc789xyz00019"

//These are not inside your GoogleService-Info.plist but you will encounter them later
-FB_SERVICEACCOUNT pertains to downloading a json file from the your project's Firebase console. You will need to go to the page SERVICE ACCOUNTS it's exp in step 3B
-clientEmail is the same thing as your Firebase Service Account. You get this from either the Unknown file or on your SERVICE ACCOUNTS page via the FB Console and it's exp in step 3D and 3B
-privateKey is the same thing as private_key but this key is NOT your API_KEY, it is a key that is inside the Unknown file from the SERVICE ACCOUNTS page. It looks something like: "-----BEGIN PRIVATE KEY-----\nCYchgacopuyvpc017246t124087t6hpUTYVPUSVDPUCHVEpcl889ljbsiugr4ygrphvuygpuy...mutli-lines...\n-----END PRIVATE KEY-----\n". Also exp in step 3B
//GoogleService-Info.plist
PROJECT_ID---aka--FB_NAME:  sneakersearch-az12
DATABASE_URL-aka--FB_URL:   https://sneakersearch-az12.firebaseio.com
API_KEY------aka--FB_TOKEN: 0012abc789xyz00019
//FB Service Account info
Firebase service account--aka--clientEmail: firebase-admin-81772@sneakersearch-az12.iam.gserviceaccount.com //this is auto generated for you once you've created your firebase project
//Heroku and Bonsai info
Heroku Instance Name--aka--Heroku App Name: sneakersearchinstanceAtoZ
BONASI_URL --aka--Bonsai Cluster URL:  https://abc123a01:01abc12de45xyz34@xyz-012345.us-east-1.bonsaisearch.net

Swift数据模型:(这将与您在步骤19中放入mappings对象的内容相匹配)

class Sneakers: NSObject{
    var sneakercondition: String?
    var sneakername: String?
 }

VC的文件路径将数据发送到Firebase,searchSnkPath是一个单独的文件路径,Bonsai将在该路径上运行其搜索:

@IBOutlet weak var conditionTextField: UITextField!
@IBOutlet weak var nameTextField: UITextField!

var dbRef: FIRDatabaseReference!
let userID = FIRAuth.auth()?.currentUser?.uid

override func viewDidLoad() {
    super.viewDidLoad()
    self.dbRef = FIRDatabase.database().reference()
 }

@IBAction func postDataButton(){

    var dict = [String:AnyObject]()
    dict.updateValue(conditionTextField.text!, forKey: "sneakercondition")
    dict.updateValue(nameTextField.text!, forKey: "sneakername")

    let idPath = self.dbRef.child("users").child(userID!).child("sneakersPath").childByAutoId()

        //searches will run on this file path
    let searchSnkPath = self.dbRef.child("searchSnkPath").childByAutoId()

    idPath.updateChildValues(dict){
       (err, ref) in
       searchSnkPath.updateChildValues(dict)
    }
  }
}

fbdatabase内部,要搜索的数据存储在根/searchsnkpath/autoid处的路径,它有两个,名为sneakerconditionsneakername表示数据。要从中提取搜索结果的路径是root/searchsnkpath

root
  |
  @-users
  |   |
  |   @-userID
  |      |
  |      @-sneakersPath
  |            |
  |            @-autoID
  |                |-sneakercondition
  |                |-sneakername
  @searchSnkPath
      |
      @-autoID
          |-sneakercondition
          |-sneakername

如果我想在searchsnkpath上搜索并查询这2个,那么在config.js文件中,我会找到exports.paths并且在其中设置要搜索的信息

exports.paths = [
   {          
      path : "https://sneakersearch-az12.firebaseio.com/searchSnkPath", //exp in Step 4
      index: "firebase", //exp in Step 17
      type : "sneakers", //exp in Step 19
      fields: ['sneakercondition', 'sneakername'] //these are the specific keys to search on (exp in Step 4)
    }
]

步骤4涵盖了所有这些

重要提示:运行Git clone https://github.com/firebase/flashlight之后(步骤2a),您需要将cd放入flashlight文件夹(步骤2b),因为从这一点开始的所有步骤都发生在flashlight文件夹中,而不是主Xcode项目的文件夹中。Xcode项目的文件夹中没有任何东西不能工作,因为它没有package.json文件

第1部分-Github步骤:

1•安装并运行ElasticSearch或通过Heroku添加盆景服务

1.意见:

1e.打开terminal并运行:node-v以查找当前运行的node版本(例如,获得v6.9.1)。在步骤2d中,您必须确保从那里得到的版本与此输出相匹配。

2•Git克隆https://github.com/firebase/flashlight

2.意见:

-您需要节点版本根据https://devcenter.heroku.com/articles/deploying-nodejs运行

-run:node-v获取flashlight文件夹(即V6.9.1)中运行的node version稍后当您创建Heroku实例时,您将根据上面的devcenter.heroku链接需要它

-既然您在flashlight文件夹内,如果您刚刚运行的节点版本与步骤1e中的版本不匹配,您将需要更新flashlight文件夹内的版本以使它们匹配。将node.js升级到最新版本,如果两个版本都匹配,那么您就不必担心这个问题了

-假设节点版本匹配,打开flashlight文件夹中的package.json文件,并添加一个“engines”对象,其键值为当前使用的节点版本

"engines": {
    "node": "node_version_num_you_got_back_from_running_node -v"
  }

2.指导:

2b.运行:Git clone https://github.com/firebase/flashlight

2c.运行:CD手电筒

2d.run:节点-v

"engines": {
    "node": "whatever_was_returned_from_Step_2D"
  }
"dependencies": {
    "JQDeferred": "~1.9.1",
    "colors": "~0.6.2",
    "elasticsearch": "^11.0.1",
    "firebase": "^3.5.2"
  },
"engines": {
    "node": "6.9.1"
  }

-您应该仍在手电筒文件夹中

-登录到firebase,在FB项目的控制台中,转到项目的设置(在概述旁边的小圆形图标),在项目设置中选择服务帐户,转到firebase管理SDK部分。这里有两件事你必须做。1.查找并复制您的Firebase service Account,它看起来像firebase-admin-81772@sneakersearch-az12.iam.gserviceaccount.com和2。在页面底部,您必须单击Generate New Private Key按钮,它将下载一个Unknown File,您需要将其重命名为service-account.json。如果它将文件命名为unknown以外的东西,只需将其重命名为service-account.json。重命名文件后,将其拖到Flashlight文件夹中,因为步骤4bFB_ServiceAccount将需要从那里访问该文件。确保您将文件放在手电筒文件夹中!

-这没有在github步骤中列出,但它是必要的。必须将Firebase Server SDK凭据添加到项目中

-以下是您正在SDK初始化的内容:

var admin = require("firebase-admin"); //this imports the npm firebase-admin module you just installed

admin.initializeApp({
      credential: admin.credential.cert({
        projectId: "<PROJECT_ID>", //projectId: is the PROJECT_ID from your GoogleService-Info.plist file
        clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com", //clientEmail: is on  line 6 in the Unknown file which is also your "Firebase service account" info
        privateKey: "-----BEGIN PRIVATE KEY-----\n<KEY>\n-----END PRIVATE KEY-----\n" //privateKey: is NOT your API_KEY/FB_TOKEN. Inside the Unknown file on line 5 there is a very long multiline "private_key" key. It looks something like "-----BEGIN PRIVATE KEY-----\nCYchgacopuyvpc017tEpcl889ljbsiugr4ygrphvuygpuy...mutli-lines...\n-----END PRIVATE KEY-----\n". You need to copy and paste it from there to here. Be sure to include the "-----BEGIN PRIVATE KEY-----\n and \n-----END PRIVATE KEY-----\n
      }),
      databaseURL: "https://<DATABASE_NAME>.firebaseio.com" //databaseURL: is the DATABASE_URL from your GoogleService-Info.plist file
    });

-请注意,在初始化SDK部分中,您还可以选择使用顶部部分,其中显示path/to/serviceAccountKey.json并且可以提供重命名的未知文件的路径。我选择底部的内联部分,因为它更容易。如果你遵循这些步骤,你就不需要担心这个。

-在Flashlight文件夹内有一个app.js文件,复制粘贴上面的代码,放在文件顶部

-返回终端内部,在命令行上运行:npm install

-如果一切都很好,您应该有的唯一警告是没有存储库字段没有许可证字段

3.指示:

3a.确保在手电筒文件夹内运行pwd

3b.登录到Firebase控制台服务帐户页面,然后单击生成新私钥按钮下载未知文件。

3c.将unknown文件重命名为service-account.json并将该文件放入flashlight文件夹中

3e.终端内部运行:NPM install Firebase-Admin--Save

3f.复制初始化SDK部分中的内容,并使用以下值初始化字段:

var admin = require("firebase-admin");

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: "sneakersearch-az12", //use your PROJECT_ID
    clientEmail: "firebase-admin-81772@sneakersearch-az12.iam.gserviceaccount.com", //clientEmail: is on  line 6 in the Unknown file
    privateKey: "-----BEGIN PRIVATE KEY-----\nCYchgacopuyvpc017tEpcl889ljbsiugr4ygrphvuygpuy...mutli-lines...\n-----END PRIVATE KEY-----\n" //privateKey: is on line 5 in the Unknown file
  }),
  databaseURL: "https://sneakersearch-az12.firebaseio.com" //use your DATABASE_URL
});

3G.在手电筒文件夹中,打开app.js文件,将上面的代码以正确的值粘贴/保存在里面

-在flashlight文件夹中有一个名为config.example.js的文件,请打开它

-在这个config.example.js文件中,您可以找到fb_urlfb_serviceaccount变量(它们列在第13和23行)

-您需要将exports.fb_url=process.env.fb_url'https:// .firebaseio.com'; 更改为exports.fb_url=process.env.fb_url'whatever_your_database_url_is';(请确保将whatever_your_database_url_is放在单引号或双引号内)

-第23行exports.fb_serviceaccount=process.env.fb_acc'service-account.json';用于访问步骤3c中的service-account.json文件(这里不需要添加或更改任何内容,因为它将自己访问该文件)

-您现在必须设置数据所在的路径(类似于上面ViewController中用于将数据发送到FB的searchPath)、索引(步骤17)以及您希望在第64、65和66行上监视的类型(类似于您的数据模型

exports.paths = [
  {
    path : "users",//line 64
    index: "firebase",//line 65
    type : "user"//line 66
  },

-路径数据位于FB内部的位置。这是您希望从中提取搜索结果的位置,即 /searchsnkpath

-步骤17中的indexexp

-步骤19中的typeexp

-通知行69-79将设置您要监视的另一个路径。如果需要,您可以删除或注释这些内容。您还可以创建更多的路径来监视,例如,如果您有一个路径 /searchclothingpath ,那么您也可以在该路径上设置搜索。如果您想要添加更多路径,也可以添加以下路径:

exports.paths = [
    {
      path : "https://sneakersearch-az12.firebaseio.com/searchSnkPath"
      index: "firebase",
      type : "sneakers"
    },
    {
      path : "<DATABASE_URL>/searchClothingPath"
      index: "firebase",
      type : "clothingDataModel",
      fields: ['jeans','shirts']//completely optional to use
    },
    {
      path : "<DATABASE_URL>/searchHatsPath"
      index: "firebase",
      type : "hatDataModel",
    },
    //etc...

-fyi字段是将在ES中索引的。这是一个可以选择添加的东西。如果您有10个并且只希望其中的2个被索引,那么您将添加这个键。这意味着在这10个键中,只有这2个是可搜索的。您还可以使用config.js文件中的parse函数来执行相同的操作

-随后保存/关闭config.example.js并将其重命名为config.js

4.指示:

4a.打开config.example.js文件,在第13行将exports.fb_url=process.env.fb_url“https:// .firebaseio.com”; 更改为exports.fb_url=process.env.fb_url“https://sneakersearch-az12.firebaseio.com”;

4b.第23行用于访问service-account.json文件(只要您在步骤3c中重命名了unknown file就可以继续)

4c.第64、65、66行是我要监视的内容,在第67行,我为我要搜索的两个Firebase数据库键添加了Fields键,尽管这不是必需的

exports.paths = [
  {
    path : "https://sneakersearch-az12.firebaseio.com/searchSnkPath",//line 64
    index: "firebase",//line 65
    type : "sneakers",//line 66
    fields: ['sneakercondition', 'sneakername']//line 67
  },

4d.保存/关闭config.example.js文件。现在将文件重命名为config.js

5.评论:

-您要到最后才会运行这个命令,所以暂时跳过它,但有些事情您应该知道。运行node app.js可以在本地计算机上运行Heroku应用程序。它会在本地查找你没有的ElasticSearch,所以你会得到连接错误。如果要在本地运行它,则必须在步骤12b运行export bonsai_url=“ 代码-可选,这是解决本地连接错误所需的。如果您的应用程序进入睡眠状态/崩溃(例如接近尾声时),您将不得不再次运行export bonsai_url=“ 命令。另外,当你把代码推到应用程序上时,Heroku会自动运行它。

-到现在为止,对于此步骤,您需要打开app.js文件,并根据https://docs.bonsai.io/docs/nodejs添加一些代码。您应该在var elasticsearch=require('elasticsearch')声明之后的任何地方添加代码。

/*
this code is already inside the app.js file. You should add the code anywhere below it

var elasticsearch = require('elasticsearch'),
  conf = require('./config'),
  fbutil = require('./lib/fbutil'),
  PathMonitor = require('./lib/PathMonitor'),
  SearchQueue = require('./lib/SearchQueue');
*/

//You need to add
var bonsai_url = process.env.BONSAI_URL;
var client = new elasticsearch.Client({
                         host: bonsai_url,
                         log: 'trace' 
                     });
    // Test the connection...
client.ping({
    requestTimeout: 30000,
    hello: "elasticsearch"
  },
  function (error) {
    if (error) {
      console.error('>>>My Bonsai url is>>>' + bonsai_url)
      console.error('>>>Elasticsearch cluster is down!');
    } else {
      console.log('All is well');
    }
  }
);

5、打开app.js文件,添加下面的代码并保存文件:

var bonsai_url = process.env.BONSAI_URL;
var client = new elasticsearch.Client({
                         host: bonsai_url,
                         log: 'trace' 
                     });
    // Test the connection...
client.ping({
    requestTimeout: 30000,
    hello: "elasticsearch"
  },
  function (error) {
    if (error) {
      console.error('>>>My Bonsai url is>>>' + bonsai_url)
      console.error('>>>Elasticsearch cluster is down!');
    } else {
      console.log('All is well');
    }
  }
);

6•curl-X POST http://localhost:9200/firebase

6.评论:

-跳过此步骤,因为此时cpu上没有本地ES可索引

6.指示:

6.跳过此步骤

7•CD手电筒

7.评论:

-不需要运行此操作,您应该仍在flashlight文件夹中

7.指示:

7.跳过此步骤

8•Heroku登录

8.评论:

-开路端子

8b.在提示符处输入您的电子邮件地址密码以登录到Heroku

9•heroku创建(将heroku添加到项目)

-盆景URL可能类似于https://abc123a01:01abc12de45xyz34@xyz-012345.us-east-1.bonsaisearch.net

11.指示:

11a.运行:heroku config

12.评论:

-12a为必填项。在此步骤中,您需要使用项目的GoogleService-Info.plistPROJECT_IDAPI_KEYFB_NAME以及FB_Token

-12b是可选的。如果要在本地连接到elasticsearch,请运行此操作。您必须设置盆景URL以便运行节点app.js不会引发连接错误。可以通过运行:export bonsai_url=“ 来实现。您将需要在每个终端会话中运行此命令,或者如果您的Heroku应用程序沉睡/崩溃。

-不要在等号前后使用空格

12.指示:

12a(必需)。运行:heroku配置:set fb_name=sneakersearch-az12 fb_token=0012abc789xyz00019

13.指示:

13a.运行:git add config.js

13b.如果出现错误,请运行:git add config.js-f

15.运行:Git push heroku Master

16•Heroku PS:刻度worker=1(启动dyno worker)

16.评论:

-这个命令的作用的答案是:谁能解释一下“heroku ps:scale web=1”

16.指示:

16.run:heroku ps:scale worker=1

-它所做的是创建一个名为/firebase的索引,该索引指向您的盆景URL。打开config.js文件并查找exports.paths(第62行)。它有一个名为index:“firebase”的键/值对(第65行),该值指向刚刚创建的索引,并从那里访问ES集群

-基本上在config.js文件中,第65行的indexfirebase必须与添加到endcurl-xpost命令的名称/firebase完全匹配。如果名字不匹配,那么这一切都行不通。

-如果成功,则应返回此响应:{“已确认”:true}

17.指示:

17.run:curl-x POST https://abc123a01:01abc12de45xyz34@xyz-012345.us-east-1.bonsaisearch.net/firebase

18•现在使用步骤5节点app.js(运行应用程序)

18.运行:node app.js

19•设置映射对象

{
  "sneakers": {
     "properties": {
       "sneakercondition": {
         "type": "string"
       },
       "sneakername": {
         "type": "string"
       }
     }
  }
}
//notice this is just like the Swift Sneakers Data Model declared at the beginning
=== web (Free): npm start (1)
web.1: crashed 2017/01/01 12:00:00 -0500 (~ 38m ago)

=== worker (Free): node ./app.js (1)
worker.1: crashed 2017/01/01 12:00:00 -0500 (~ 10m ago)
heroku help //help
heroku status //Heroku platform status
heroku logs //displays 100 logs
heroku logs --tail //realtime logs
heroku logs --tail | grep worker //dyno worker logs
heroku ps -a <heroku app name> //how many dyno hrs you have left
heroku config:get BONSAI_URL //gets only your bonsai url
heroku config //all your environment variables
heroku apps:info //your Heroku credentials 
 类似资料:
  • 问题内容: 我有一个运行在Cedar堆栈上的node.js应用程序,我很困惑为什么安全cookie无法正常工作。 在localhost上,一切正常,但在heroku上,我似乎无法设置安全cookie。我究竟做错了什么?该文档称,负载平衡器终止SSL,它说的是配置在那里? 非常感谢 问题答案: 您认为Heroku在到达您的应用之前会先终止SSL。这导致express看到非SSL流量,这可能就是为什么

  • 问题内容: 我希望能够设置一个cookie,并在对nodejs服务器实例的每个请求中读取单个cookie。是否可以用几行代码来完成,而无需引入第三方库? 只是尝试直接从nodejs.org中获取上述代码,然后在其中工作一个cookie。 问题答案: 无法快速访问获取/设置Cookie的功能,因此我想到了以下技巧: 这会将所有cookie存储到cookie对象中,并且在编写头部时需要设置cookie

  • 我正在使用firebase云函数,firebase auth和FireStore。我以前在firebase数据库中做过这样的工作,但在firestore中不确定如何将users集合中的文档设置为新创建的firebase auth用户的uid。 上面的内容在日志中完成ok,但是在数据库中没有设置uid。我需要在某个阶段调用set吗?

  • 我正在使用nvm来管理我的Node.js版本。在我的项目中,我在项目根目录中有。nvmrc文件。当我运行时,我得到了项目所需的Node.js版本。 这一切都很好,但是当我打开一个新的控制台窗口时,一开始我总是自动设置一个非常旧的Node.js版本。

  • 问题内容: 我正在研究RoR,并将此虚拟机设置为“部署” RoR,并且陷入了Node.js的安装过程。 我正在使用Ubuntu 12.04,并且遵循了本指南的这一步骤: http://railsapps.github.com/installing- rails.html 从Rails 3.1开始,在Ubuntu Linux上进行开发需要JavaScript运行时(Mac OS X或Windows则

  • Node.js v22中,WebSocket如何使用? 希望得到代码案例。