我有一个firebase实时数据库,它有用户节点,包含许多用户,我想将用户的rating
属性设置为0,对于第一个,我需要读取数据库并更新数据库。
我的功能是读取数据,但无法在浏览器上更新和返回{}
exports.quarter = functions.https.onRequest((req, res) => {
let user1 = admin.database().ref('users/user1/userDetails').once('value');
let user2 = admin.database().ref('users/user2/userDetails').once('value');
let user3 = admin.database().ref('users/user3/userDetails').once('value');
let user4 = admin.database().ref('users/user4/userDetails').once('value');
Promise.all([user1, user2, user3, user4])
.then(result => {
let data = {};
result[0].forEach(action => {
data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[1].forEach(action => {
data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[2].forEach(action => {
data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[3].forEach(action => {
data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
return data;
}).then(data => {
console.log(data);
return admin.database().ref().update(data);
}).then(data => {
return res.send('done');
}).catch(error => {
return res.status(500).send(error);
})
});
我可以看到console.log(data)
的结果,但是函数没有更新,最后在执行get请求之后,它返回{}
。
这有什么问题呢?
发布于 2019-06-06 01:01:43
这行admin.database().ref().update(data)
你引用的似乎是undefined
,看一下docs
我不确定你的意思是不是把你定义的ref放在最上面
let user1 = admin.database().ref('users/user1/userDetails').once('value');
如果是这样的话..你必须像这样做
let user1 = admin.database().ref('users/user1/userDetails');
user1.once('value')
// and down where you want to update
user1.update.(data)
但请注意,这只是该节点的数据,如果您想使用您的方法,您不能一次更新所有的em
发布于 2019-06-06 02:06:50
在传递给它的任何承诺完成之前,Promise.all()
就会返回。这意味着data
将是一个具有原始定义的空对象,该值将立即返回。相反,您应该使用以下then
回调来处理每个结果:
exports.quarter = functions.https.onRequest((req, res) => {
let user1 = admin.database().ref('users/user1/userDetails').once('value');
let user2 = admin.database().ref('users/user2/userDetails').once('value');
let user3 = admin.database().ref('users/user3/userDetails').once('value');
let user4 = admin.database().ref('users/user4/userDetails').once('value');
return Promise.all([user1, user2, user3, user4]);
}).then(data => {
// data will be an array of all the results. Handle them here.
})
});
发布于 2019-06-06 02:45:49
下面的代码应该可以解决这个问题:
exports.quarter = functions.https.onRequest((req, res) => {
let user1 = admin
.database()
.ref('users/user1/userDetails')
.once('value');
let user2 = admin
.database()
.ref('users/user2/userDetails')
.once('value');
let user3 = admin
.database()
.ref('users/user3/userDetails')
.once('value');
let user4 = admin
.database()
.ref('users/user4/userDetails')
.once('value');
Promise.all([user1, user2, user3, user4])
.then(result => {
let data = {};
result[0].forEach(action => {
data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[1].forEach(action => {
data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[2].forEach(action => {
data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
result[3].forEach(action => {
data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
});
console.log(data);
return admin
.database()
.ref()
.update(data);
})
.then(() => {
return res.send('done');
})
.catch(error => {
return res.status(500).send(error);
});
});
https://stackoverflow.com/questions/56464919
复制相似问题