Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌云功能赢得';不要写入Firebase Firestore_Javascript_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 谷歌云功能赢得';不要写入Firebase Firestore

Javascript 谷歌云功能赢得';不要写入Firebase Firestore,javascript,node.js,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我的Google Cloud函数从IBM Watson文本到语音获取音频文件,将其保存到Firebase存储,并获取签名下载URL。有时它会将下载URL写入Firestore。大多数时候不会。代码如下: exports.IBM_T2S=functions.firestore.document('Users/{userID}/Spanish/IBM_T2S_Request').onUpdate((change)=>{ if(change.after.data().word!=未定义){ //获取请

我的Google Cloud函数从IBM Watson文本到语音获取音频文件,将其保存到Firebase存储,并获取签名下载URL。有时它会将下载URL写入Firestore。大多数时候不会。代码如下:

exports.IBM_T2S=functions.firestore.document('Users/{userID}/Spanish/IBM_T2S_Request').onUpdate((change)=>{
if(change.after.data().word!=未定义){
//获取请求字
让word=change.after.data().word;
console.log(word);
让wordFileType=word+'.mp3';
var综合参数={
文字:word,
接受:“音频/mpeg”,
语音:“es-LA_SofiaVoice”/“es-es_LauraVoice”、“es-es_EnriqueVoice”、“es-US_SofiaVoice”,
};
const{Storage}=require('@googlecloud/Storage');
常量存储=新存储();
const bucket=storage.bucket('myApp.appspot.com');
const file=bucket.file('Audio/西班牙语/拉丁美洲/'+wordFileType);
var TextToSpeechV1=require('watson-developer-cloud/text-to-speechv1');
var textToSpeech=新TextToSpeechV1({
用户名:“groucho”,
密码:“箭鱼”,
网址:'https://stream.watsonplatform.net/text-to-speech/api'
});
const options={//构造要写入的文件
元数据:{
contentType:“音频/mpeg”,
元数据:{
来源:“IBM Watson文本到语音”,
语言代码:“es LA”,
性别:'女性'
}
}
};
变量配置={
行动:“读”,
到期日期:“03-17-2025”
};
返回textToSpeech.synthesis(synthesizeParams).on('error',函数(error){
console.log(错误);
}).pipe(文件.createWriteStream(选项))
.on('error',函数(error){
控制台错误(error);
})
.on('finish',function(){
log(“写入存储器的音频文件”);
//看https://stackoverflow.com/questions/42956250/get-download-url-from-file-uploaded-with-cloud-functions-for-firebase
file.getSignedUrl({
行动:“读”,
到期日期:“03-17-2025”
})
.然后(函数(signedUrls){
console.log(signedUrls[0]);
log(“Word现在是:“+Word”);
//问题就在这里
返回admin.firestore().collection('Dictionaries').doc('西班牙语').collection('Words').doc(word).collection('发音').doc('Latin_America')。更新({
音频文件:signedUrls[0]
})
.然后(函数(){
log(“下载写入数据库的URL,IBM拉丁美洲,更新”);
返回0;
})
.catch(函数(错误){
控制台错误(error);
返回0;
});
// *****
})
.catch(函数(错误){
控制台错误(error);
返回0;
});
});//接近
}否则{
控制台错误(“错误”);
返回0;
}
});
道格·史蒂文森说

当所有异步工作时,您不会返回已解决的承诺 完成了。如果不这样做,云函数将假定所有 您的工作已经完成,将限制所有资源,以及任何 待完成的工作将被关闭

translate.translate().then().catch()返回的承诺正在被删除 忽略。对admin.firestore()…set()的嵌套调用具有类似的 问题仅对每个对象调用then()和catch()是不够的 承诺,因为then()和catch()都会返回另一个承诺

我不知道该返回什么地方。第一个异步调用

返回textToSpeech.synthesis(synthesizeParams).on('error',函数(error){
必须返回,以防止返回未定义的错误
函数、预期承诺或值
。也就是说,云函数在异步函数返回之前完成执行,因此您需要在第一个异步函数之前执行
返回

IBM Watson返回的可能是回调,而不是承诺

我返回最后一个异步函数,正如Doug Stevenson所说:

return admin.firestore().collection('dictionary').doc('Spanish').collection('Words').doc(word).collection('发音').doc('Latin_America')。更新({
音频文件:signedUrls[0]
})
.然后(函数(){
log(“下载写入数据库的URL,IBM拉丁美洲,更新”);
返回0;
})
.catch(函数(错误){
控制台错误(error);
返回0;
});
换句话说,我返回了第一个异步函数和最后一个异步函数。这感觉不对。是否有文档说明返回在Google云函数中的位置

我还将
return0;
放入捕获中,这样即使出现错误,云函数也会关闭


云功能通常在
“音频文件写入存储”处停止。
有时会继续记录下载URL,有时会将下载URL写入Firestore。为什么有时会写入Firestore,有时则不写入?

看起来您在()返回承诺。是吗?我怀疑不是。是的,IBM Watson返回回调,而不是承诺。当我返回IBM Watson textToSpeech.synthesis函数时,错误消息“函数返回了未定义、预期的承诺或值”停止了,因为它不返回承诺或值(它创建了一个流)。您的视频不包括回调。大多数现代API使用承诺,或者让您在两者之间进行选择。您可以自己将回调转换为承诺。看起来您假设
on()
返回承诺。是吗?我怀疑不是。是的,IBM Watson返回回调,而不是承诺。我对错误消息感到惊讶当我返回IBM Watson textToSpeech.synthesis函数时,“函数返回未定义的预期承诺或值”停止,因为它不返回承诺或值(它创建了一个流)