在ExpressJS Fetch中嵌套异步/等待

时间:2019-08-31 12:46:59

标签: javascript express fetch

到目前为止,我下面的API中间件代码都能正常工作。 我真的想确保快速服务器中没有任何阻塞呼叫。 因此,我还制作了包含异步获取功能的函数。

我的问题是,那根本有必要吗?因为实际上第一次等待应该已经解除对我的快递服务器的阻止,对吗?

代码如下:

var express = require('express')
var router = express.Router()
const asyncMiddleware = require('./utils/asyncMiddleware');

async function fetchCall(URL, bodyJson, wpToken) {      
    try {        
        return await fetch(URL, {
            method: "POST",
            credentials: "same-origin",
            headers:  {
                "Authorization": "Bearer " + wpToken,
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
            body: bodyJson
    });
    } catch (error) {       
        return {status:544, error:error};
    }
}

router.post("/registerVendor", asyncMiddleware(async (req, res, next) => {              
    const response = await fetchCall(myApiUrl, req.body, 1)
    return res
    .status(response.status)
    .send({ data: response});
}));

module.exports = router

1 个答案:

答案 0 :(得分:2)

如果问题是,您是否必须将fetch放在单独的async函数中,答案是否定的,您没有。它可能有用,但您没有。如您所说,如果您直接等待fetch承诺,则将结束async路由回调的同步部分。

  

我的问题是,此函数(在我的代码示例中为“ fetchCall”)是否必须异步。

不,不是。它甚至不必返回承诺,因为您可以await任何值。例如,以下日志按顺序记录A,B,C,D和E:

async function foo() {
    console.log("B");
    await 42;
    console.log("D");
}

console.log("A");
foo()
.then(() => {
    console.log("E");
})
.catch(error => {
    console.error(error);
});
console.log("C");

当然,您要返回承诺。 :-)这将起作用:

function fetchCall(URL, bodyJson, wpToken) {      
    return fetch(URL, {
        method: "POST",
        credentials: "same-origin",
        headers:  {
            "Authorization": "Bearer " + wpToken,
            "Content-Type": "application/json",
            "Accept": "application/json"
        },
        body: bodyJson
    })
    .catch(error => ({status:544, error:error}));
}

也就是说,async / await的优点在于,它使我们可以从同步代码中熟悉的分支和循环结构中编写异步代码...