更改为 Firebase 3 后,我的 Firebase 队列没有执行任何操作
My Firebase Queue doesn't do anything after I changed to Firebase 3
几周前我开始使用 Firebase,并且在我的 node.js 服务器代码上安装了 Firebase Queue 运行。客户端可以将消息推送到 queue/tasks,服务器会解析它们。在 Firebase 更改为版本 3 后,我无法复制它,即使 Firebase Queue 已更新并且似乎没有其他人遇到问题。这可能只是我代码中的一个小错误,但几天后我还没有找到它,如果有人能为我指出它,我将不胜感激。
这是我的服务器代码。每当将任务添加到队列时,它应该打印到控制台,但事实并非如此。最后一行push说明可以连接服务器
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.
这是我的客户端代码。推送到 queue/tasks 成功。
<!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>
这对我有用:
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();});
注意 - 您需要 post 一个结构而不是一个值到任务中。如果不是
,您可能会发现它有效
ref.push('this is a push from the client');
你用
ref.push({"name": "this is a push from the client"});
此外,在您尝试从网页执行作业请求的地方,我认为您还需要对用户进行身份验证,因为我认为应用程序初始化不会对用户进行身份验证,而只是识别连接。
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>
请注意,您还需要在 /queue 路径的 auth 中添加用户并配置访问权限。
我通过 firebase auth/users 控制台屏幕手动添加了 peter@pscott.com.au 的用户名和密码。
您想要优化的初始配置。
{
"rules": {
".read": false,
".write": false,
"queue": {
".read": true,
".write": true
}
}
}
如果您像上面那样打开了授权,那么您将能够使用 curl 从命令行测试客户端请求:
curl -X POST -d '{"foo": "bar"}' https://heretikchess-250ed.firebaseio.com//queue/tasks.json
如果仍有问题,请检查 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
几周前我开始使用 Firebase,并且在我的 node.js 服务器代码上安装了 Firebase Queue 运行。客户端可以将消息推送到 queue/tasks,服务器会解析它们。在 Firebase 更改为版本 3 后,我无法复制它,即使 Firebase Queue 已更新并且似乎没有其他人遇到问题。这可能只是我代码中的一个小错误,但几天后我还没有找到它,如果有人能为我指出它,我将不胜感激。
这是我的服务器代码。每当将任务添加到队列时,它应该打印到控制台,但事实并非如此。最后一行push说明可以连接服务器
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.
这是我的客户端代码。推送到 queue/tasks 成功。
<!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>
这对我有用:
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();});
注意 - 您需要 post 一个结构而不是一个值到任务中。如果不是
,您可能会发现它有效ref.push('this is a push from the client');
你用
ref.push({"name": "this is a push from the client"});
此外,在您尝试从网页执行作业请求的地方,我认为您还需要对用户进行身份验证,因为我认为应用程序初始化不会对用户进行身份验证,而只是识别连接。
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>
请注意,您还需要在 /queue 路径的 auth 中添加用户并配置访问权限。 我通过 firebase auth/users 控制台屏幕手动添加了 peter@pscott.com.au 的用户名和密码。
您想要优化的初始配置。
{
"rules": {
".read": false,
".write": false,
"queue": {
".read": true,
".write": true
}
}
}
如果您像上面那样打开了授权,那么您将能够使用 curl 从命令行测试客户端请求:
curl -X POST -d '{"foo": "bar"}' https://heretikchess-250ed.firebaseio.com//queue/tasks.json
如果仍有问题,请检查 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