Jeśli używasz Mongoose lub MongoDB, to podając callback jako ostatni parametr do metody ona nie zwraca promisa, więc nie musisz tego await-ować. Albo await i wtedy bez callbacka, albo callback bez await.
https://mongoosejs.com/docs/api.html#model_Model.findOne
Podpowiedzi zamieściłem w komentarzach w kodzie. Przy okazji - czy któryś z przypadków nie rzuca w konsoli błędem? Funkcje, w których używasz await muszą być asynchroniczne - słówko async - a nie w każdym przypadku u Ciebie tak jest, więc konsola powinna rzucać błędem.
Pierwszy przypadek:
exports.findRelation = (req, res) => {
let startId, endId;
getStation(req.body.start)
.then(result => { // [1]
startId = result;
});
getStation(req.body.end)
.then(result => { // [2]
endId = result;
});
console.log(startId, endId); // [3] <- to i return poniżej wykonają się przed punktami 1 i 2, ponieważ tam oczekujesz na promisa
return res.json({startId, endId});
}
async function getStation (name) {
await Stations.findOne({name: name}, (err, result) => {
if (err) return console.log(err);
else return result._id; // <- tego nie zwracasz poza metodę Stations.findOne
});
// <- tutaj powinieneś zwrócić wartość z wywołania Stations.findOne(..)
}
Powinno działać w ten sposób:
exports.findRelation = async (req, res) => {
const startId = await getStation(req.body.start);
const endId = await getStation(req.body.end);
console.log(startId, endId);
return res.json({startId, endId});
}
function getStation (name) {
return Stations.findOne({name: name});;
}
Drugi przypadek wygląda ok, tylko zapomniałeś oznaczyć funkcji, w których używasz await jako async i ponowny błąd z brakiem returna w getStation:
exports.findRelation = async (req, res) => { // <- tutaj async
const startId = await getStation(req.body.start);
const endId = await getStation(req.body.end);
console.log(startId, endId);
return res.json({startId, endId});
}
function getStation (name) {
return Stations.findOne({name: name});
}
Trzeci przypadek - co tutaj jest logowane w console.log(stationsId); pod koniec funkcji? Na oko powinna być tablica z propertisami startId i endId, ale nie w formie indeksowanych elementów, lecz propertisów obiektowych, bo zamiast pushować te zmienne do tablicy, to przypisałeś je jak do obiektu.
Czwarty przypadek - czemu tworzysz zmienną global a później operujesz na zmiennej stationsId? Poza tym, podobnie jak w trzecim przypadku.
Uwaga ogólna - gdy używasz await, to warto ten kod owinąć w try..catch, żeby móc obsłużyć ewentualny błąd.