- 預訂航班是方案中的一個陣列,其中存盤了用戶預訂的航班。
- 我正在嘗試將陣列中的所有航班回傳到前端。像下面的例子:- //必須是物件陣列
[
{
_id: new ObjectId("61a4fa41fa24c144efce8038"),
FlightNumber: '1',
DepartureTime: 2013-08-03T02:00:00.000Z,
To: 'Cairo',
From: 'Alexandria',
ArrivalTime: 2014-08-03T02:00:00.000Z,
First: 1,
EconomySeats: 2,
BusinessSeats: 3,
ArrivalTerminal: ' ',
DepartureTerminal: ' ',
AvailableFSeats: [ 1 ],
AvailableESeats: [ 1, 2 ],
AvailableBSeats: [ 1, 2, 3 ],
createdAt: 2021-11-28T22:26:27.339Z,
updatedAt: 2021-11-29T22:09:13.946Z,
__v: 0,
BaggageAllowance: '6 kg',
TicketPrice: 5555,
Type: 'Normal'
},
{
_id: new ObjectId("61a51f3dcf237cbdc514698a"),
FlightNumber: '2',
DepartureTime: 2013-08-03T02:00:00.000Z,
To: 'Egypt',
From: 'Saudi Arabia',
ArrivalTime: 2014-08-03T02:00:00.000Z,
First: 4,
EconomySeats: 3,
BusinessSeats: 3,
ArrivalTerminal: 'Jaddah Airport',
DepartureTerminal: 'Cairo Airport',
AvailableFSeats: [ 1, 2, 3, 4 ],
AvailableESeats: [ 1, 2, 3 ],
AvailableBSeats: [ 1, 2, 3 ],
BaggageAllowance: '50 KG',
Type: 'Normal',
TicketPrice: 10000,
createdAt: 2021-11-29T18:43:09.158Z,
updatedAt: 2021-11-29T22:08:35.212Z,
__v: 0
}
]
- 這是我到達的代碼:
UserRoutes.get('/Showresflights', (req,res) => {
var rf = [];
var flights = [];
User.findById("61a52b332239b52f7ef5cc68", function (err, docs) {
rf = docs.ReservedFlights;
for(var i=0;i<rf.length;i )
{
Flight.findById(rf[i]).then(result => {
//console.log(result);
flights[i]=result;
})
.catch(err => {
console.log(err);
});
}
console.log("flights:" flights);
res.send(flights);
});
});
- console.log(result) 回傳以下內容:
//每次飛行都單獨回傳物件而不是需要的物件陣列。
{
_id: new ObjectId("61a4fa41fa24c144efce8038"),
FlightNumber: '1',
DepartureTime: 2013-08-03T02:00:00.000Z,
To: 'Cairo',
From: 'Alexandria',
ArrivalTime: 2014-08-03T02:00:00.000Z,
First: 1,
EconomySeats: 2,
BusinessSeats: 3,
ArrivalTerminal: ' ',
DepartureTerminal: ' ',
AvailableFSeats: [ 1 ],
AvailableESeats: [ 1, 2 ],
AvailableBSeats: [ 1, 2, 3 ],
createdAt: 2021-11-28T22:26:27.339Z,
updatedAt: 2021-11-29T22:09:13.946Z,
__v: 0,
BaggageAllowance: '6 kg',
TicketPrice: 5555,
Type: 'Normal'
}
{
_id: new ObjectId("61a51f3dcf237cbdc514698a"),
FlightNumber: '2',
DepartureTime: 2013-08-03T02:00:00.000Z,
To: 'Egypt',
From: 'Saudi Arabia',
ArrivalTime: 2014-08-03T02:00:00.000Z,
First: 4,
EconomySeats: 3,
BusinessSeats: 3,
ArrivalTerminal: 'Jaddah Airport',
DepartureTerminal: 'Cairo Airport',
AvailableFSeats: [ 1, 2, 3, 4 ],
AvailableESeats: [ 1, 2, 3 ],
AvailableBSeats: [ 1, 2, 3 ],
BaggageAllowance: '50 KG',
Type: 'Normal',
TicketPrice: 10000,
createdAt: 2021-11-29T18:43:09.158Z,
updatedAt: 2021-11-29T22:08:35.212Z,
__v: 0
}
- 我試圖制作之前代碼中看到的航班陣列,以在每次迭代中將每次航班的結果保存在其中,但看起來由于 .then 沒有保存任何內容
- 我想保存從結果中回傳的每個物件,但我不知道這樣做的確切語法是什么,因為我什至不知道結果的型別是什么。
uj5u.com熱心網友回復:
關于“如何從異步呼叫回傳回應? ”的超級經典問題。
Mongoose 方法是異步的,您可以使用await它們。還添加.lean()回傳簡單的 JSON(更快)并.exec()回傳您可以等待的真正 Promise。
UserRoutes.get('/Showresflights', async (req, res) => {
let flights = [];
try {
const rfs = (await User.findById("61a52b332239b52f7ef5cc68")).ReservedFlights;
for (let rf of rfs) flights.push(await Flight.findById(rf).lean().exec());
console.log("flights:" flights);
res.json(flights);
} catch (err) {
console.log(err);
res.status(500).json(err); // Reply to your client in case of error, otherwise it's just gonna hang forever
}
});
但是,問題在于,您每次飛行都要進行一次資料庫呼叫。您可以一次為所有航班撥打一個電話:
UserRoutes.get('/Showresflights', async (req, res) => {
try {
const rfs = (await User.findById("61a52b332239b52f7ef5cc68").lean().exec()).ReservedFlights;
const flights = await Flight.find({
_id: { $in: rfs }
}).lean().exec();
console.log("flights:" flights);
res.json(flights);
} catch (err) {
console.log(err);
res.status(500).json(err);
}
});
更好的解決方案是讓您的航班直接由貓鼬在您的架構中填充。一個資料庫呼叫整個:
const user = await User.findById("61a52b332239b52f7ef5cc68")
.populate("ReservedFlights")
.select("ReservedFlights") // optional, but you just select the field you're interested in
.lean()
.exec();
res.json(user.ReservedFlights); // bam
uj5u.com熱心網友回復:
.then()塊中的代碼被執行asynchronious,所以for回圈將在所有Flight.findById(rf[i])呼叫完成之前完成。
你需要正確地等待所有的東西。
下面是其中利用在端的實施例中并行地執行的一切,并等待一個例子Array.map()和Promise.all():
UserRoutes.get('/Showresflights', (req, res) => {
// added async keyword to callback function so we can use "await" within callback
User.findById("61a52b332239b52f7ef5cc68", async function (err, docs) {
// correctly handle error event!
if(err) {
console.error(err)
res.status(500).send('Server error')
return
}
// use try catch for error handling instead of .catch()
try {
// I call Array.from() since I am not sure if docs.ReservedFlights is a real array!.
// you can probably omit the Array.from()..
const rf = Array.from(docs.ReservedFlights).map(flightId => {
// call the async function and return it's promise
return Flight.findById(flightId)
})
// now await all the Promises since they are async operations.
const flights = await Promise.all(rf)
// after the for loop is done, send back result.
console.log("flights:" flights);
res.status(200).send(flights);
} catch (err) {
// on any error, send back a response!
console.log(err);
res.status(500).send('Server error.')
}
});
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370894.html
標籤:javascript 节点.js 反应
上一篇:ReactHookuseEffect缺少依賴項:'ans.group._id'。要么包括它要么洗掉依賴陣列,為什么?
