无法读取云功能中的托管文件
Can't read hosting files in a cloud Function
我的 Firebase 功能不工作。这是日志:
11:01:03.932 AM warning getWatsonToken Error: ENOENT: no such file or directory, open '../public/javascript/services/watsonTokenValue.js'
at Error (native)
11:01:03.831 AM warning getWatsonToken Uncaught exception
11:01:03.233 AM info getWatsonToken 5YGY3R%2FBP0zelDOaob9PnxMWDj...
11:01:00.139 AM outlined_flag getWatsonToken Function execution took 804 ms, finished with status: 'ok'
11:00:59.834 AM info getWatsonToken Executing function!
11:00:59.335 AM outlined_flag getWatsonToken Function execution started
我不知道 "Uncaught exception" 指的是什么。
"ENOENT: no such file or directory" 错误可能是节点路径错误。这是我的目录结构:
── functions
├── index.js // this is my function
── public
├── javascript
│ ├── services
│ │ ├── watsonTokenValue.js // this is the file I want to write to
这是明显导致错误的行:
fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
该行使用Node写文件。路径有问题吗?
完整函数如下:
// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');
admin.initializeApp(functions.config().firebase);
exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in
console.log("Executing function!");
var username = '56ae6a1e7854',
password = 'swordfish',
url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';
request({url: url}, function (error, response, body) {
console.log(body);
var tokenService = "app.value('watsonToken','" + body + "');";
fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
if (err) throw err;
console.log('The file has been saved!');
}); // close fs.writeFile
}); // close request
return 0; // prevents an error message "Function returned undefined, expected Promise or value"
}); // close getWatsonToken
前四行加载节点模块。该函数称为 "getWatsonToken." 它在用户登录时触发,或者更具体地说,当登录过程中的一行代码将用户的 Auth ID 写入 Firebase 实时数据库中的某个位置时,然后 onUpdate 触发该函数。接下来,为 HTTP 请求定义参数,然后将 HTTP 请求发送到 IBM Watson。 IBM returns 其语音到文本服务的令牌作为 HTTP 响应的主体。 (A console.log 显示令牌,这是有效的。)一些 Angular JavaScript 然后包裹在令牌周围。最后,文件被写入目录中的某个位置。最后一步好像是哪里出错了
这是我的目录结构的另一个视图:
感谢您的帮助!
您不能使用 Cloud Functions 读取和写入 Firebase 托管服务的文件,即使在同一个项目中也是如此。
当您使用 Firebase CLI 进行部署时,每个产品都是单独部署的。因此,public
文件夹中 Firebase 托管的所有静态内容都会发送到一个地方,而所有 Cloud Functions 代码都会发送到另一个地方。在那之后,他们没有任何共同点。
部署后,您可以读取functions
文件夹下的文件。但很明显,部署后这些与Hosting无关。
我强烈建议不要尝试在云函数中写入文件,尤其是对于您的用例。通过将持久数据写入实时数据库、Firestore 甚至云存储,可以更好地满足您的需求。 Cloud Functions 中的磁盘文件不是永久性的,您可能有多个服务器 运行 函数实例,彼此之间一无所知。
谢谢道格!这是我的 Firebase 函数:
// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');
admin.initializeApp(functions.config().firebase);
exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in
var username = '56ae6a1e7854',
password = 'swordfish',
url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';
request({url: url}, function (error, response, body) {
admin.database().ref('IBMWatsonToken').set({'token': body})
.then(function() {
console.log("Token saved!");
}); // close promise
}); // close request
return 0; // prevents an error message "Function returned undefined, expected Promise or value"
}); // close getWatsonToken
这会将令牌写入我的 Firebase 实时数据库。我的控制器代码是:
firebase.database().ref('IBMWatsonToken').on('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
$scope.watsonToken = childSnapshot.val();
});
});
此代码引用 Firebase 实时数据库中的位置,然后 on
监听值的变化,然后 forEach
读取值并将值放在 $scope
上要使用的控制器功能。
我会通过删除函数中的 promise 和 console.log
来加快速度。
我的 Firebase 功能不工作。这是日志:
11:01:03.932 AM warning getWatsonToken Error: ENOENT: no such file or directory, open '../public/javascript/services/watsonTokenValue.js'
at Error (native)
11:01:03.831 AM warning getWatsonToken Uncaught exception
11:01:03.233 AM info getWatsonToken 5YGY3R%2FBP0zelDOaob9PnxMWDj...
11:01:00.139 AM outlined_flag getWatsonToken Function execution took 804 ms, finished with status: 'ok'
11:00:59.834 AM info getWatsonToken Executing function!
11:00:59.335 AM outlined_flag getWatsonToken Function execution started
我不知道 "Uncaught exception" 指的是什么。
"ENOENT: no such file or directory" 错误可能是节点路径错误。这是我的目录结构:
── functions
├── index.js // this is my function
── public
├── javascript
│ ├── services
│ │ ├── watsonTokenValue.js // this is the file I want to write to
这是明显导致错误的行:
fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
该行使用Node写文件。路径有问题吗?
完整函数如下:
// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');
admin.initializeApp(functions.config().firebase);
exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in
console.log("Executing function!");
var username = '56ae6a1e7854',
password = 'swordfish',
url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';
request({url: url}, function (error, response, body) {
console.log(body);
var tokenService = "app.value('watsonToken','" + body + "');";
fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
if (err) throw err;
console.log('The file has been saved!');
}); // close fs.writeFile
}); // close request
return 0; // prevents an error message "Function returned undefined, expected Promise or value"
}); // close getWatsonToken
前四行加载节点模块。该函数称为 "getWatsonToken." 它在用户登录时触发,或者更具体地说,当登录过程中的一行代码将用户的 Auth ID 写入 Firebase 实时数据库中的某个位置时,然后 onUpdate 触发该函数。接下来,为 HTTP 请求定义参数,然后将 HTTP 请求发送到 IBM Watson。 IBM returns 其语音到文本服务的令牌作为 HTTP 响应的主体。 (A console.log 显示令牌,这是有效的。)一些 Angular JavaScript 然后包裹在令牌周围。最后,文件被写入目录中的某个位置。最后一步好像是哪里出错了
这是我的目录结构的另一个视图:
感谢您的帮助!
您不能使用 Cloud Functions 读取和写入 Firebase 托管服务的文件,即使在同一个项目中也是如此。
当您使用 Firebase CLI 进行部署时,每个产品都是单独部署的。因此,public
文件夹中 Firebase 托管的所有静态内容都会发送到一个地方,而所有 Cloud Functions 代码都会发送到另一个地方。在那之后,他们没有任何共同点。
部署后,您可以读取functions
文件夹下的文件。但很明显,部署后这些与Hosting无关。
我强烈建议不要尝试在云函数中写入文件,尤其是对于您的用例。通过将持久数据写入实时数据库、Firestore 甚至云存储,可以更好地满足您的需求。 Cloud Functions 中的磁盘文件不是永久性的,您可能有多个服务器 运行 函数实例,彼此之间一无所知。
谢谢道格!这是我的 Firebase 函数:
// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');
admin.initializeApp(functions.config().firebase);
exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in
var username = '56ae6a1e7854',
password = 'swordfish',
url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';
request({url: url}, function (error, response, body) {
admin.database().ref('IBMWatsonToken').set({'token': body})
.then(function() {
console.log("Token saved!");
}); // close promise
}); // close request
return 0; // prevents an error message "Function returned undefined, expected Promise or value"
}); // close getWatsonToken
这会将令牌写入我的 Firebase 实时数据库。我的控制器代码是:
firebase.database().ref('IBMWatsonToken').on('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
$scope.watsonToken = childSnapshot.val();
});
});
此代码引用 Firebase 实时数据库中的位置,然后 on
监听值的变化,然后 forEach
读取值并将值放在 $scope
上要使用的控制器功能。
我会通过删除函数中的 promise 和 console.log
来加快速度。