云功能在模拟器中工作,但在部署时不起作用



我正在尝试创建一个集合和一个文档,一旦文档在Firebase中创建。

它在模拟器中工作得很好,但是当我将我的函数部署到Firebase项目时,它们不创建该集合和文档。

但是如果我在现有文档(快照)中创建字段,它就可以工作了。

在函数中,我从API获取数据并将其写入新文档(目前未创建)。

功能:

exports.quoteEndPoint = functions.firestore.document('users/{userID}/followedStocks/{stockID}')
.onCreate((snap, context) => {
const stock_id = context.params.stockID;
const user_id = context.params.userID;
var request = require('request');
var http = require('https');
const options = {
"method": "GET",
"hostname": "alpha-vantage.p.rapidapi.com",
"port": null,
"path": '/query?function=GLOBAL_QUOTE&symbol='+stock_id+'&datatype=json',
"headers": {
"x-rapidapi-host": "%API_HOST%",
"x-rapidapi-key": "%API_KEY%",
"useQueryString": true
}
};

const req = http.request(options, function(res){
const chunks = [];
res.on('data', function(chunk){
chunks.push(chunk);
});
res.on('end', function(){
const body = Buffer.concat(chunks);
//console.log(body.toString());
const result = JSON.parse(body.toString());
console.log(result);
//set values from json responso to Firebase
return snap.ref.collection('quoteEndPoint').doc('data').set(
{
'symbol': result['Global Quote']['01. symbol'],
'open': result['Global Quote']['02. open'],
}, { merge: true }).then(()=>{
console.log('New quoteEndPoint fields for ' + stock_id + ' added to Firebase');
})
.catch(err => {
console.log(err);
});             
});
})
.on('error',(err) => {
console.log('Error: '+err.message);
});
req.end();

return true;
});

我试图使函数:function()异步,但它不工作。

在模拟器中创建和填充值到正确的路径:/users/7nDGdHmZDuoDiJkxixgz/followwedstocks/AMD/quoteEndPoint/data

有人能帮忙吗?

感谢

你的问题很可能来自这样一个事实,request的调用不返回一个承诺,而在云函数触发的后台事件(如.onCreate()为Firestore),你必须返回一个承诺。观看这个官方视频系列了解更多细节:特别是三个题为"学习JavaScript承诺"的视频。

另外,不支持使用request

你可以使用axios,它返回一个Promise,或者node-fetch。你需要链接异步操作返回的承诺,例如axios和Firestore异步调用,如下面的代码"skeleton"所示:

const functions = require('firebase-functions');
const admin = require('firebase-admin');   
const axios = require('axios');
exports.quoteEndPoint = functions.firestore.document('users/{userID}/followedStocks/{stockID}')
.onCreate((snap, context) => {

const stock_id = context.params.stockID;
const user_id = context.params.userID;
return axios({
method: 'get',
url: 'http://....'
// ... See the doc
})
.then(response => {
// ...
return snap.ref.collection('quoteEndPoint').doc('data').set(...);
});
});

相关内容

  • 没有找到相关文章

最新更新