Часть 1. Ваш обработчик ошибок не должен падать.
Если вы позвоните res.status(200)
, Express начнет потоковую передачу данных клиенту (заголовки уже отправлены). После этого вы не можете изменить статус ответа с помощью res.status(500)
, поскольку код состояния уже находится на пути к клиенту.
stuff()
.then(result => {
res.status(200).send(result); // server starts sending
}).then(moreStuff) // error occurs here
.catch(error => {
res.status(500).send(error); // fails, as server is already sending
});
Чтобы решить эту проблему, вы должны начинать потоковую передачу любых данных только после выполнения всех ваших задач:
stuff().then(moreStuff).then(evenMoreStuff) // error occurs here
.then(result => {
res.status(200).send(result); // doesnt get executed
}).catch(error => {
console.error(error);
res.status(500).send("Whoops, server error\n" + error.message); // works
});
Часть 2. Логика внутри вашей ошибки не должна выдаваться вообще.
Теперь, когда обработчик ошибок работает правильно, вы сможете узнать, что на самом деле идет не так в вашем коде.
(Мы не можем помочь вам без правильного сообщения об ошибке)
Часть 3. Реализация требуемого условного выполнения:
Чтобы условно выполнить обещания, вы должны вложить их:
a().then(() => {
if(!stuff) return; // exit early, continue at next then
return b().then(c); // conditionally execute b and c
}).then(rest); // executes after b and c if stuff is true
Часть 4. Теперь, когда все работает, вы можете изменить код на async
/ await
, чтобы сделать его более читабельным:
Как вы указали, v6 dpes не поддерживает async
/ await
, вам придется перейти на v8 или вы перенесете его с помощью веб-пакета :
module.exports = async function(req, res) {
try {
//...
const userRecord = await admin.auth().getUser(phone);
const orderResponse = await rp(options)
await admin.database().ref('trs/'+ phone)
.push({ pay_id: orderResponse.id });
await admin.database().ref('ors/'+ phone)
.push({ pay_id })
if(saveThisAddress === true) {
await admin.database().ref('address/'+phone)
.push({address: finalAddress});
}
await admin.database().ref('deliveryStatus/'+phone+'/'+orderNumber)
.set({ plan: planName === "" ? "Single Day Plan" : planName, delivered: false});
if(couponCodeName !== "") {
await admin.database().ref(`couponCodes/${couponCodeName}`)
.update({couponUsage: couponUsage + 1 });
}
if(usersCouponUsage !== "") {
await admin.database().ref(`couponUsage/${phone}`)
.update({ [couponCodeName]: usersCouponUsage + 1 });
}
res.status(200).send({ success:true });
} catch(error) {
console.error("Error inside API", error);
res.status(422).send({ error });
}
};