2

I started using Firebase a couple of weeks ago, and had Firebase Queue running on my node.js server code. Clients could push messages to queue/tasks, and the server would resolve them. I cannot replicate this after Firebase has changed to version 3, even though Firebase Queue has been updated and no-one else seems to be having problems. It is probably just a minor bug in my code, but I haven't found it after a couple of days, and I would appreciate it if someone could point it out for me.

Here I have my server code. It should print to the console whenever a task is added to the queue, but it isn't. The push on the last line demonstrates that it is able to connect to the server.

var firebase = require('firebase');
var Queue = require('firebase-queue');

firebase.initializeApp({
  serviceAccount: 'serviceAccountCredentials.json',
  databaseURL: 'https://heretikchess-250ed.firebaseio.com/'
});

var ref = firebase.database().ref('queue');

var queue = new Queue(ref, function(data, progress, resolve, reject) {
  console.log('This should print whenever a task is pushed onto the queue.')
  console.log(data);
  setTimeout(function() {
  resolve();
  }, 1000);
});

ref.push('this is a push from the server');
//This push works fine, so there's no problem connecting to the server.

And here is my client code. The pushes to queue/tasks are successful.

<!doctype html>
<html lang='en'>
<head>
    <meta charset="utf-8">
    <title>Why won't my code work?</title>
    <script src="https://www.gstatic.com/firebasejs/3.0.0/firebase.js"></script>
    <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
</head>

<body>

    <div>
        <h3>Submit push to firebase</h3>
        <button id='submitbutton' class='btn btn-default' type='button'>Submit</button>
    </div>

<script>
      var config = {
        apiKey: "AIzaSyCJKI3tjnnuOIcx2rnOuSTUgncuDbbxfwg",
        authDomain: "heretikchess-250ed.firebaseapp.com",
        databaseURL: "https://heretikchess-250ed.firebaseio.com",
        storageBucket: "heretikchess-250ed.appspot.com",
      };
      firebase.initializeApp(config);

      var ref = firebase.database().ref('queue/tasks');

      //Send message to queue/tasks
    $('#submitbutton').click(function() {
        ref.push('this is a push from the client');
    })
    </script>
</body>
</html>
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • I think that you need to use the queue/tasks subtree though I am just starting out. Also could you confirm your environment with: npm list firebase-queue, npm -v and npm list firebase just to be sure I am using the same versions. May also want to check out http://stackoverflow.com/questions/36460698/how-push-a-task-with-specid-in-firebase-queue-with-nodejs?rq=1 – Peter Scott May 24 '16 at 20:47

1 Answers1

2

This works for me:

server.js

var firebase = require('firebase');
var Queue = require('firebase-queue');

firebase.initializeApp({
  serviceAccount: 'serviceAccountCredentials.json',
  databaseURL: 'https://heretikchess-250ed.firebaseio.com/'
});

var db = firebase.database();
var ref = db.ref("queue");
var queue = new Queue(ref, function(data, progress, resolve, reject) {
  console.log('This should print whenever a task is pushed onto the queue.')
  console.log(data);
  setTimeout(function() { // NB: the record will be entirely removed when resolved
    resolve();
  }, 1000);
});

client.js

var firebase = require('firebase');
var Queue = require('firebase-queue');

firebase.initializeApp({
  serviceAccount: 'serviceAccountCredentials.json',
  databaseURL: 'https://heretikchess-250ed.firebaseio.com/'
});
var db = firebase.database();
var ref = db.ref("queue");

var task = {'userId': "Peter"};

// ref.child('tasks').push('this is a push from the client"}); 
// NB the above doesn't work because it's a string and not a structure
ref.child('tasks').push({"name": "this is a push from the client"}).then(function(){ process.exit();});

NB - you need to post a structure and not a value into tasks. You may find that it works if instead of

ref.push('this is a push from the client');

you use

ref.push({"name": "this is a push from the client"});

Also where you are trying to perform the job requests from the web page I believe that you will also need to authenticate the user as the app initialize does not I believe authenticate the user but merely identifies the connection.

index.html

<!doctype html>
<html lang='en'>
<head>
    <meta charset="utf-8">
    <title>Why won't my code work?</title>
    <script src="https://www.gstatic.com/firebasejs/3.0.0/firebase.js">       
</script>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'>    
</script>
</head>

<body>

    <div>
        <h3>Submit push to firebase</h3>
        <button id='submitbutton' class='btn btn-default' type='button'>Submit</button>
    </div>

<script>
  var config = {
    apiKey: "AIzaSyCJKI3tjnnuOIcx2rnOuSTUgncuDbbxfwg",
    authDomain: "heretikchess-250ed.firebaseapp.com",
    databaseURL: "https://heretikchess-250ed.firebaseio.com",
    storageBucket: "heretikchess-250ed.appspot.com",
  };
  firebase.initializeApp(config);

  var ref = firebase.database().ref('queue/tasks');

  // NEED TO AUTH THE CONNECTION AS A USER

  firebase.auth().signInWithEmailAndPassword('peter@pscott.com.au', 'password').catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  }).then( function(){console.log('peter logged in')});


  //Send message to queue/tasks
$('#submitbutton').click(function() {
    ref.push({'frompeter':'this is a push from the client'});
})
</script>
</body>
</html>

Note that you will also need to add the user and configure the access permissions in the auth for the /queue path. I manually added the username for peter@pscott.com.au and password through the firebase auth/users console screen.

A starter config that you would want to refine.

{
    "rules": {
        ".read": false,
        ".write": false,
        "queue": {
        ".read": true,
        ".write": true
        }
    }
}

If you have the auth open as above then you will be able to test a client request from the command line using curl:

curl -X POST -d '{"foo": "bar"}' https://heretikchess-250ed.firebaseio.com//queue/tasks.json 

If still having problems perhaps check all your library versions from shell.

## Display node version
npm -v
##  ( mine is 3.9.0 )

npm list firebase
## mine is 3.0.2

npm list firebase-queue
## mine is 1.4.0
Peter Scott
  • 1,318
  • 12
  • 19