如何使用 firebase 函数通过 FTP 下载文件?
How to download a file through FTP with a firebase function?
问题:
不幸的是,我的函数在几秒钟内就完成了执行,而不是完全执行。这显然是因为监听器被声明为流式传输数据:据我所知,它们不是我可以等待的承诺。
如何让我的 firebase 函数完整执行?
代码:
exports.fifteenMinutesData = functions
.runWith(runtimeOpts)
.pubsub
.schedule('*/15 * * * *')
.timeZone('Etc/UTC')
.onRun((context) => {
return (async() => {
try {
const Client = require('ftp');
const c = new Client();
c.connect({
host: "...",
user: "..."
});
c.on('ready', async function () {
c.get('text.txt', async function (err, stream) {
if (err)
throw err;
var content = '';
stream.on('data', function (chunk) {
content += chunk.toString();
});
stream.on('end', function () {
(async () => {
try {
let data = content;
//etc....
}
catch(err) {
console.log("ERR: "+err);
}
})()
})
})
})
}
catch(err) {
console.log("ERR: "+err)
}
})()
});
您需要承诺结果,以便模块知道该值是异步的。目前,你的回调没有通知模块任何事情,所以执行会立即退出,你需要一个像
这样的格式
exports.fifteenMinutesData = functions
.runWith(runtimeOpts)
.pubsub
.schedule('*/15 * * * *')
.timeZone('Etc/UTC')
.onRun((context) => new Promise((resolve, reject) =>
{
});
你在哪里为成功路径调用 resolve(data);
,为所有错误执行路径调用 reject(err);
。
问题:
不幸的是,我的函数在几秒钟内就完成了执行,而不是完全执行。这显然是因为监听器被声明为流式传输数据:据我所知,它们不是我可以等待的承诺。
如何让我的 firebase 函数完整执行?
代码:
exports.fifteenMinutesData = functions
.runWith(runtimeOpts)
.pubsub
.schedule('*/15 * * * *')
.timeZone('Etc/UTC')
.onRun((context) => {
return (async() => {
try {
const Client = require('ftp');
const c = new Client();
c.connect({
host: "...",
user: "..."
});
c.on('ready', async function () {
c.get('text.txt', async function (err, stream) {
if (err)
throw err;
var content = '';
stream.on('data', function (chunk) {
content += chunk.toString();
});
stream.on('end', function () {
(async () => {
try {
let data = content;
//etc....
}
catch(err) {
console.log("ERR: "+err);
}
})()
})
})
})
}
catch(err) {
console.log("ERR: "+err)
}
})()
});
您需要承诺结果,以便模块知道该值是异步的。目前,你的回调没有通知模块任何事情,所以执行会立即退出,你需要一个像
这样的格式exports.fifteenMinutesData = functions
.runWith(runtimeOpts)
.pubsub
.schedule('*/15 * * * *')
.timeZone('Etc/UTC')
.onRun((context) => new Promise((resolve, reject) =>
{
});
你在哪里为成功路径调用 resolve(data);
,为所有错误执行路径调用 reject(err);
。