节点js中的顺序请求

sequential request in node js

我正在学习使用 express 库在节点 js 中制作 API 我有两件事:产品,订单 每个订单都有一个地址,一个或多个产品以及基于产品价格的总价 当我尝试保存订单时,我只是传递了产品 ID,所以在代码中我应该获取产品并对它们的价格求和,而且我想在响应中显示产品,所以我所做的就是将 ID 放入一个数组中,然后我执行了数组中的 foreach 循环,在每个循环中我得到产品并将其推送到数组中。 问题是在我得到产品之前执行了响应(实际上是 foreach 循环之后的每个代码), 我搜索了 Async/Await 并尝试实现它,但没有成功 我的代码是这样的

function getproductpromis(options){
    return new Promise((resolve,reject) =>{
        http.get(options, resolt =>{
            let data ;
            resolt.on('data', d => {
                data +=d;
            })
            resolt.on('end', f =>{
                resolve (data);
            })
            resolt.on('error', e =>{
                reject(e);
                console.log(e);
            })
        });
    });
}

async function getproduct(element){
    let object;
    const options = {
        hostname:'localhost',
        port:5000,
        path:'/products/'+element,
        mathod:'GET'
    }

    const request_call = await getproductpromis(options);
    console.log('request_call');
    console.log(request_call);

    return request_call;


}

router.post('/',(req,res,next) => {
    let prod;
    console.log(req.body.products);
    const ids = req.body.products;
    let totalprice = 0;
    let objects =[];
    ids.forEach(element => {
        prod = getproduct(element);
        console.log('prod');
        console.log(prod);

        objects.push(prod);
    });
    res.status(200).json({
        objects
    });
}

这是我的日志:

[ '5dab2706baab4b1e90dc30ff', '5dab2792f0662d4f54bbf1f1' ]
prod
Promise { <pending> }
prod
Promise { <pending> }
POST /orders 200 56.974 ms - 19
{ _id: 5dab2706baab4b1e90dc30ff,
  name: 'langero',
  quantity: 5,
  price: 1500,
  __v: 0 }
GET /products/5dab2706baab4b1e90dc30ff 200 208.973 ms - 114
request_call
undefined{"massage":"product found","product":{"ID":"5dab2706baab4b1e90dc30ff","name":"langero","quantity":5,"price":1500}}
{ _id: 5dab2792f0662d4f54bbf1f1,
  name: 'langer',
  quantity: 5,
  price: 1500,
  __v: 0 }
GET /products/5dab2792f0662d4f54bbf1f1 200 1172.254 ms - 113
request_call
undefined{"massage":"product found","product":{"ID":"5dab2792f0662d4f54bbf1f1","name":"langer","quantity":5,"price":1500}}

和我在邮递员那里得到的回应 response

所以你想要执行和一系列 Promise,你在正确的轨道上,但我可以为你指出 Async/Await. Here I marked your router.post callback as async so I can use await. I use Array.map to return an array of promises that get passed to Promise.all

的方向
router.post("/", async (req, res, next) => {
    const ids = req.body.products;

    const objects = await Promise.all(
        ids.map((id) => {
            return getproduct(id);
        })
    );

    res.status(200).json({
        objects
    });
});

forEach 循环更改为 for...of 循环 [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of]

这是您使用 async/awaitfor...of 循环

更新后的 router.post
router.post('/',async (req,res,next) => {
let prod;
console.log(req.body.products);
const ids = req.body.products;
let totalprice = 0;
let objects =[];
for (let element of ids) {
    prod = await getproduct(element);
    console.log('prod');
    console.log(prod);

    objects.push(prod);
}
res.status(200).json({
    objects
});
}