无法在快速路由器内返回请求

时间:2019-08-07 17:03:53

标签: node.js reactjs express request

我在后端设置了一个快速路由器,希望将一些信息返回到前端,但是我试图将其分离为单独的功能,以便我可以重用某些功能。

当我在路由器函数中发出请求时,它的行为符合预期,但是当我将其中断时,它总是返回未定义状态,这使我觉得我没有正确返回它。

以下作品,并返回我试图获得的项目链接:

router.get('/test', (req, res) => {

    var options = {
        method: 'GET',
        url: url + '/api/projects',
        headers:
        {
            Cookie: req.params.token
        },
        qs: 
        {
            limit: '1000',
            q: `name:${req.params.project_name}` 
        }
    };

    request(options, (error, response, body) => {
        if (error) {
             throw new Error(error);
        }

        const jsonBody = JSON.parse(body);

        const projectLink = jsonBody.items[0]['_meta']['href']

        console.log(projectLink)

        return res.send({ "project_link": projectLink })
    });
})

但是,当我尝试将上述请求分解为自己的功能并从router.get('/ test')调用时,它以未定义的形式返回,但是它将预期值记录在test()中:

router.get('/test', (req, res) => {
    let projectId;
    projectId = test(req.query.bearer_token, req.query.project_name);

    console.log('projID', projectId);
    return res.send(projectId)
})

let test = ( token, project_name ) => {

    var options = {
        method: 'GET',
        url: url + '/api/projects',
        headers:
        {
            Cookie: token
        },
        qs: 
        {
            limit: '1000',
            q: `name:${project_name}` 
        }
    };

    request(options, (error, response, body) => {
        if (error) {
             throw new Error(error);
        }

        const jsonBody = JSON.parse(body);

        const projectLink = jsonBody.items[0]['_meta']['href']

        console.log(projectLink)

        return projectLink
    });

}

我怀疑正在发生一些使请求变得复杂的请求初始化,因为正在从前端发出请求,该前端正在调用返回请求的函数。 返回projectLink的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

它是一个异步调用,因此您应该使用promise或async await,这样它只有在返回值时才继续进行。否则它将开始执行下一行,而不是等待。

const rp = require("request-promise");
router.get('/test', async (req, res) => {
    let projectId;
    projectId = await test(req.query.bearer_token, req.query.project_name);

    console.log('projID', projectId);
    return res.send(projectId)
})

let test = async (token, project_name) => {

    var options = {
        method: 'GET',
        uri: url + '/api/projects',
        headers: {
            Cookie: token
        },
        qs: {
            limit: '1000',
            q: `name:${project_name}`
        },
        json: true
    };

    const body = await rp(options)
    if (!body) {
        throw "api response ..........."
    }

    const jsonBody = JSON.parse(body);

    const projectLink = jsonBody.items[0]['_meta']['href']

    console.log(projectLink)

    return projectLink
}