javascript - 无法读取云功能中的托管文件

标签 javascript node.js firebase google-cloud-functions firebase-hosting

我的 Firebase 功能不工作。这是日志:

enter image description here

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

我不知道“未捕获的异常”指的是什么。

“ENOENT:没有这样的文件或目录”错误可能是 Node 路径错误。这是我的目录结构:

── 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

前四行加载 Node 模块。该函数称为“getWatsonToken”。它在用户登录时触发,或者更具体地说,当登录过程中的一行代码将用户的 Auth ID 写入 Firebase 实时数据库中的某个位置时,然后 onUpdate 触发该函数。接下来,为 HTTP 请求定义参数,然后将 HTTP 请求发送到 IBM Watson。 IBM 为其语音到文本服务返回一个 token 作为 HTTP 响应的主体。 (console.log 显示 token ,它正在工作。)一些 Angular JavaScript 然后包裹在 token 周围。最后,文件被写入目录中的某个位置。最后一步似乎是错误的地方。

这是我的目录结构的另一个 View :

enter image description here

感谢您的帮助!

最佳答案

即使在同一项目中,您也无法使用 Cloud Functions 读取和写入 Firebase 托管提供的文件。

当您使用 Firebase CLI 进行部署时,每个产品都是单独部署的。因此,public 文件夹中 Firebase 托管的所有静态内容都会发送到一个地方,而所有 Cloud Functions 代码都会发送到另一个地方。之后,他们没有任何共同点。

可以在部署后读取functions 文件夹下的文件。但很显然,这些与部署后的 Hosting 无关。

我强烈建议不要尝试在 Cloud Functions 中写入文件,尤其是对于您的用例。通过将持久数据写入实时数据库、Firestore 甚至云存储,可以更好地满足您的需求。 Cloud Functions 中的磁盘文件不是持久性的,您可能有多个服务器实例运行彼此一无所知的函数。

关于javascript - 无法读取云功能中的托管文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408563/

相关文章:

javascript - JS中括号的意义

javascript - Canvas 数据到图像

javascript - 如何从 javascript 函数内的 .then 返回值?

javascript - 我的辅助函数应该放在哪里?

mysql - 如何在aws linux机器中配置node js datasource.json

firebase - flutter - NoSuchMethodError : The method '[]' was called on null

ios - 如何从 Swift 调试器访问对象嵌套属性

ios - FIRDatabaseReference 返回 nil,但可检索 UserID

javascript - 使用 Mongo 的内部时钟设置 Unix 时间戳

javascript - AngularJS 中的 View - 如何使它们工作?