从Node / Express

时间:2018-07-16 20:45:56

标签: node.js express

我有一个定义了路由(GET)的myRoute.js,我想从另一个路由(api.js)调用api端点,但我不确定执行此操作的正确方法是什么。 api.js路由正常运行(下图和代码)。

api.js

router.get('/getGroups/:uid', function(req, res, next) {    
  let uid = req.params.uid;
  db.getAllGroups(uid).then((data) => {
    let response =[];
    for (i in data) {
      response.push(data[i].groupname);
    }
    res.status(200).send(response);
   })
   .catch(function (err) {
     return err;  
   });  
});

按预期工作:

enter image description here

myRoute.js

我希望当用户进入localhost:3000 / USER_ID时,路由定义从api获取信息。下面的伪代码(someFunction)。

router.get('/:uid', function(req, res, next) {
  let uid = req.params.uid;
  let fromApi = someFunction(`localhost:3000/getAllGroups/${uid}`); // <--!!!
  console.log(fromApi) ;  //expecting array
  res.render('./personal/index.jade', {fromApi JSON stringified});
});

2 个答案:

答案 0 :(得分:4)

不知道我是否理解您的正确,但无论如何我会尽力提供帮助。所以你有一个

router.get('/getGroups/:uid', function(req, res, next) {    
  let uid = req.params.uid;
  db.getAllGroups(uid).then((data) => {
    let response =[];
    for (i in data) {
      response.push(data[i].groupname);
    }
    res.status(200).send(response);
   })
   .catch(function (err) {
     return err;  
   });  
});

如果您想重复使用它,可以从上面的代码中提取一个函数,如下所示:

async function getAllGroupsByUserId(uid){
  const result = [];
  try{
    const data = await db.getAllGroups(uid);
    for (i in data) {
      result.push(data[i].groupname);
    };
    return result;
  }
  catch(e) {
    return e;
  }
}

然后在您的api和您想要的任何地方重用它:

router.get('/getGroups/:uid', async function(req, res, next) {    
  const uid = req.params.uid;
  const groups = await getAllGroupsByUserId(uid);
  res.status(200).send(groups);
})

与您在另一条路线上可以做的相同:

router.get('/:uid', async function(req, res, next) {
  const uid = req.params.uid;
  const fromApi = await getAllGroupsByUserId(uid); // <--!!!
  console.log(fromApi) ;  //expecting array
  res.render('./personal/index.jade', {fromApi JSON stringified});
});

看起来很清晰:)

答案 1 :(得分:1)

我将为此使用fetch。您可以将someFunction替换为fetch,然后将res.render代码放入.then()中。因此,您将获得以下信息:

const fetch = require("node-fetch");

router.get('/:uid', function(req, res, next) {
  let uid = req.params.uid;
  fetch('localhost:3000/getAllGroups/${uid}').then(res => res.json()).then(function(data) {
    returned = data.json();
    console.log(returned);  //expecting array
    res.render('./personal/index.jade', {JSON.stringify(returned)});
  });
});

一种更强大的错误处理方法是编写如下代码:

const fetch = require("node-fetch");

function handleErrors(response) {
  if(!response.ok) {
    throw new Error("Request failed " + response.statusText);
  }
  return response;
}

router.get('/:uid', function(req, res, next) {
  let uid = req.params.uid;
  fetch('localhost:3000/getAllGroups/${uid}')
  .then(handleErrors)
  .then(res => res.json())
  .then(function(data) {
    console.log(data) ;  //expecting array
    res.render('./personal/index.jade', {JSON.stringify(data)});
  })
  .catch(function(err) {
    // handle the error here
  })
});

理想的方法是将您的代码抽象为一个方法,这样您就不会像The Reason所说的那样自称。但是,如果您真的想打电话给自己,这将起作用。