我在后端设置了一个快速路由器,希望将一些信息返回到前端,但是我试图将其分离为单独的功能,以便我可以重用某些功能。
当我在路由器函数中发出请求时,它的行为符合预期,但是当我将其中断时,它总是返回未定义状态,这使我觉得我没有正确返回它。
以下作品,并返回我试图获得的项目链接:
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的正确方法是什么?
答案 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
}