В настоящее время я создаю облачную функцию для очистки некоторых данных с сайтов электронной коммерции.Я запускаю их в среде Node.js v8, поэтому я могу использовать async/await
без транспаранта.
Мне нужен способ сохранить файл с ответом html с веб-сайта, чтобы я могосмотрите его и решите, как лучше его почистить.И я не смог заставить его работать.
Поскольку я обнаружил повторный поиск во многих местах, мне нужен способ обещать функцию fs.writeFile()
, чтобы я мог await
для нее.Я пробовал с util.promisify
, а также строил пользовательскую функцию ниже (обе приводят к одному и тому же результату, который вызывает сбой моей облачной функции, когда я await
для результата):
index.js (основной файл для облачных функций - упрощенная версия)
const functions = require('firebase-functions');
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
// PROMISIFY WRITEFILE TO SAVE URL RESPONSE
const promisifiedWriteFile = function(text) {
return new Promise((resolve, reject) => {
fs.writeFile('./response.html', text, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
};
exports.getUrlProductDetails = functions.https.onCall(
async (data) => {
try {
// SEND REQUEST TO URL PRODUCT PAGE, PARSE WITH CHEERIO
response = await promisifiedRequest(productURL);
$ = cheerio.load(response.body);
// TRYING TO SAVE FILE
await promisifiedWriteFile('12345'); // <----- THIS IS CRASHING
} // TRY BLOCK - OUTER - END
catch (err) {
console.log(err);
throw new functions.https.HttpsError('unknown', 'Some internal error', err);
}
console.log('End of async function...');
return {
productDetails: productDetails,
body: response.body // My client code is getting the body response just fine
};
Примечание 1: Это упрощенная версия кода, но единственная строка, в которой происходит сбой функции,: await promisifiedWriteFile('12345');
и когда я это комментирую, все остальное работает просто отлично.
Примечание2: Файл response.html
создается (с пустым содержимым) даже при сбое функции наэтот момент.
Примечание 3: Я должен пытаться написать response.body
.'12345'
только для тестирования.Но в любом случае происходит сбой.
Что я делаю не так?
РЕДАКТИРОВАТЬ
// THIS IS WHAT LOGS OUT OF MY FUNCTION
info: User function triggered, starting execution
info: Execution took 2034 ms, finished with status: 'crash'
И вот что получает мой клиент:сообщение об ошибке просто internal
, потому что облачные функции избегают передачи подробностей внутренней ошибки клиенту.
Примечание 4: Iеще не развернул функцию.Это все на местном развитии.