Я новичок в node js, и я хотел бы записать информацию в функции обратного вызова в мою базу данных firebase.
Я искал, и кажется, что обратный вызов асинхронный. Как я могу использовать firestore в этом обратном вызове?
exports.registerRestaurantPayout = functions.firestore.document('*********')
.onCreate(async (paymentSnap, context) => {
var request = require('request');
var authCode = paymentSnap.data().auth_code;
var firstString = 'client_secret=********&code=';
var secondString = '&grant_type=authorization_code';
var dataString = firstString + authCode + secondString;
var options = {
url: 'https://connect.stripe.com/oauth/token',
method: 'POST',
body: dataString
};
function callback(error, response, body) {
if (!error && response.statusCode === 200) {
console.info(body);
return await firestore.document('***********')
.set({'account': body}, {merge: true});
//return await paymentSnap.ref.set({'account': body}, {merge: true});
}else{
//return await paymentSnap.ref.set({'error' : error}, { merge: true });
}
}
request(options, callback);
});
Я получаю следующую ошибку Ошибка синтаксического анализа: Неожиданное хранилище токенов, хотя я могу использовать хранилище вне обратного вызова. Конкретная проблема заключается в операторе return в обратном вызове.
@RenaudTarnec Спасибо за ваш ответ, я только что обновил код, и да, это часть облачной функции.





В облачной функции вы должны использовать промисы для обработки асинхронных задач (таких как HTTP-вызов к Stripe API или запись в базу данных реального времени). По умолчанию request не возвращает промисы, поэтому вам нужно использовать оболочку интерфейса для запроса, например request-promise, и адаптировать свой код следующим образом:
const rp = require('request-promise');
exports.registerRestaurantPayout = functions.firestore.document('*********')
.onCreate((paymentSnap, context) => {
var authCode = paymentSnap.data().auth_code;
var firstString = 'client_secret=**********=';
var secondString = '&grant_type=authorization_code';
var dataString = firstString + authCode + secondString;
var options = {
method: 'POST',
uri: 'https://connect.stripe.com/oauth/token',
body: dataString,
json: true // Automatically stringifies the body to JSON
};
return rp(options)
.then(parsedBody => {
return paymentSnap.ref.set({'account': parsedBody}, {merge: true});
})
.catch(err => {
return paymentSnap.ref.set({'error' : err}, { merge: true });
});
});
Я бы также посоветовал вам посмотреть два следующих обязательных к просмотру видео от команды Firebase об облачных функциях и обещаниях: https://thewikihow.com/video_7IkUgCLr5oA и https://thewikihow.com/video_652XeeKNHSk.
Большое спасибо, это сработало. Видео тоже посмотрю.
@RobinOlisa Рад, что смог тебе помочь! Вы также можете проголосовать за ответ, см. stackoverflow.com/help/someone-answers. Спасибо!
Является ли ваш код частью облачной функции? Если да, не могли бы вы добавить весь код облачной функции?