如何对我后端上的API进行REST API调用

时间:2019-03-21 10:15:28

标签: node.js http express heroku request

这就是我想要达到的目标。我想使用我开发的CRUD的READ操作,这意味着我必须调用HTTP请求(例如,使用RequestJS)。然后使用来自READ的响应来做其他一些事情。

读取操作

router.get('/api/example', function(request, response, next) {
   //MongoDB Code to fetch a certain doc
   exampleModel.find(request.query.key)
   .then(function(doc) {response.status(200).json(doc)})
});

所以如您所见,我用json响应用户。我想要做的是使用此路由,并获取要在另一个函数中使用的JSON响应。某种意义上的中间件。

其他功能

function useRead(){
    //Make an HTTP Request using localhost:3000/api/example?key=123
    useJSON(doc)
}

我知道我可以使用requestJS来获取响应。但是问题是,向localhost:3000 / api / example?key = 123发出请求是否有意义。例如,当我在Heroku上部署该应用程序时,该URL就没有意义,并且我认为该应用程序将崩溃,因为它应使用www.myDomain.com而不是localhost:3000,所以如何解决此问题。

我试图尽可能简洁,抱歉,如果不清楚。

2 个答案:

答案 0 :(得分:0)

Gonzalo详细说明,请移出api路由内的逻辑到函数,导出函数以在服务器中的任何地方使用。

示例:

//Page with read operation

module.exports = {
    router : router,
    exampleFunction : exampleFunction
}

router.get('/api/example', function(req, res){
    exampleFunction(req.query, function(err, doc){
        if(err)
            console.log(err);
        response.status(200).json(doc);
    })
});

function exampleFunction(query, next) {
   //MongoDB Code to fetch a certain doc
   exampleModel.find(query.key)
   .then(function(err,doc) {
       if(err)
           return next(err,null);
       return next(null, doc);
   })
}



//page with read call

var readPage = require('readPage');


function useRead(){
    readPage.exampleFunction({query:{key:'abcd'}},function(err, doc){
        if(err)
             console.log(err);
        useJSON(doc)
    });
}

答案 1 :(得分:0)

您可能已经掌握了解决方案。假设您正在使用像react或angular这样的MV框架进行开发,或者仅使用简单的javascript进行开发,就可以使用相对路径调用API,前提是您要在同一express应用中使用express static渲染前端部分。

router.get('/api/example', function(req, res){
    exampleFunction(req.query, function(err, doc){
        if(err)
            console.log(err);
        response.status(200).json(doc);
    })
});

因此,在Web应用程序内部,您可以按以下方式调用API。

app.js (或运行应用程序的任何其他文件)

app.use('/', express.static(__dirname + 'public')); // assuming static files are placed inside public folder
async function getAPI() {
   try {
     const res = await axios.post('/path/to/api'); // Doesn't require server remote url as it is relative
   } catch (e) {
     console.log(e);
   }
}

现在前端可以像这样调用其自己的API。

额外提示(在路线内使用承诺通话)

...
const axios = require('axios'); // I am using axios. Use whatever you require
...
...
route.get('/path/to/api', (req, res) => {
  try {
    const res = await axios.get('/remote/api/);
    res.send(res.data)
  } catch (err) {
    res.status(401).send(err.data);
  }
});