Javascript 尝试在异步云函数(节点v8)内执行fs.writefile()
我目前正在构建一个云功能,从电子商务网站上获取一些数据。我在Node.js v8环境中运行它们,因此我可以使用Javascript 尝试在异步云函数(节点v8)内执行fs.writefile(),javascript,node.js,firebase,async-await,google-cloud-functions,Javascript,Node.js,Firebase,Async Await,Google Cloud Functions,我目前正在构建一个云功能,从电子商务网站上获取一些数据。我在Node.js v8环境中运行它们,因此我可以使用async/await而无需传输 我需要一种方法来保存一个文件的html响应从网站,所以我可以检查它,并决定如何最好地刮它。但我没能让它工作 正如我在许多地方发现的重新归档一样,我需要一种方法来提示fs.writeFile()函数,以便等待它。我尝试了使用util.promisify并在下面构建了自定义函数(两者都会产生相同的结果,当我等待结果时,我的云函数崩溃了): index.js(
async/await
而无需传输
我需要一种方法来保存一个文件的html响应从网站,所以我可以检查它,并决定如何最好地刮它。但我没能让它工作
正如我在许多地方发现的重新归档一样,我需要一种方法来提示fs.writeFile()
函数,以便等待它。我尝试了使用util.promisify
并在下面构建了自定义函数(两者都会产生相同的结果,当我等待结果时,我的云函数崩溃了):
index.js(云函数的主文件-简化版)
下面是我的客户端得到的:错误消息只是internal
,因为云函数避免将内部错误详细信息传递给客户端
注意4:我还没有部署该功能。这一切都是本地开发。我相信您不允许在Firebase函数上写入文件系统。尝试写入/tmp
,请参阅
但是我认为您不应该编写响应.html
,而应该在Firebase函数返回的响应中设置文本和状态代码。我已经成功地做到了
根据
os.tmpdir()
函数的代码只能写入一个目录。
下面的步骤也是如此,现在它可以工作了:
index.js
const fs = require('fs');
const os = require('os');
const path = require('path');
const tmpdir = os.tmpdir();
const filePath = path.join(tmpdir,'response.html');
// PROMISIFY WRITEFILE TO SAVE URL RESPONSE
const promisifiedWriteFile = function(text) {
return new Promise((resolve, reject) => {
fs.writeFile(filePath, text, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
};
从我调用的函数内部:
wait promisifiedWriteFile(response.body)代码>
在此链接上还找到一些相关文档:
您可以共享错误消息吗?共享您收到的错误,并使用promisified fs方法,而不是手动包装,或者使用bluebird的Promisifly或使用npm fs-extrafs\u Promissions\u api在节点中不可用8@Stanimirovv刚刚添加了错误详细信息。@AZ_u刚刚添加了错误详细信息。我会检查的。“os.tmpdir()只有一个目录是可写的”。突出这一点!你救了我的命!
// THIS IS WHAT LOGS OUT OF MY FUNCTION
info: User function triggered, starting execution
info: Execution took 2034 ms, finished with status: 'crash'
const fs = require('fs');
const os = require('os');
const path = require('path');
const tmpdir = os.tmpdir();
const filePath = path.join(tmpdir,'response.html');
// PROMISIFY WRITEFILE TO SAVE URL RESPONSE
const promisifiedWriteFile = function(text) {
return new Promise((resolve, reject) => {
fs.writeFile(filePath, text, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
};