如何在Sails js中使用外部rest api(nodejs MVC)

5 javascript rest real-time node.js sails.js

我使用sailsjs作为节点js的MVC,我还在学习它.我设法从我自己的数据库中获取数据并使用它.

但现在我需要/想要从外部休息api获取数据.我在我的控制器中使用了这个:

// api/controllers/SomeController.js
test : function(res,req){
    var j;

    var https = require('https');

    var options = {
      hostname: 'testing.atlassian.net',
      port: 443,
      path: '/rest/api/2/search?jql=project=ABC',
      method: 'GET',
      headers: {'Authorization': 'Basic ' + 'SuperSecretLoginAndPassword'}
    };

    var req = https.request(options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function(d) {

      });
     });

    req.end();
}
Run Code Online (Sandbox Code Playgroud)

变量d显示正确的结果.如何在我的视图中使用请求结果?我搜索了很多,但我无法找到任何方法在我的视图中显示这一点.

这会实时更新吗?因此,如果de rest api中的某些内容发生了变化,我就不必刷新了.

对不起,如果这是愚蠢的.

mar*_*ebl 7

基本上你会等待你的请求触发它的回调,然后将获取的数据输入res.locals.假设您正在获取JSON数据,您可以这样做:

// api/controllers/SomeController.js
test: function(req, res) {
  var https = require('https');

  ...

  https.request(options, function(response) {
    var responseData = '';
    response.setEncoding('utf8');

    response.on('data', function(chunk){
      responseData += chunk;
    });

    response.once('error', function(err){
      // Some error handling here, e.g.:
      res.serverError(err);
    });

    response.on('end', function(){
      try {
        // response available as `responseData` in `yourview`
        res.locals.requestData = JSON.parse(responseData);
      } catch (e) {
        sails.log.warn('Could not parse response from options.hostname: ' + e);
      }

      res.view('yourview');
    });
  }).end();

}
Run Code Online (Sandbox Code Playgroud)

您提供的示例代码有一些问题:

  • test: function(res,req) ... 不要混淆控制器参数,第一个是_req_uest,第二个是_res_ponse.

  • var req = https.request ...您真的不想覆盖req传递给控制器​​操作的参数.使用其他名称.

  • https.request(options, function(res) {...}同样在这里.这样做会覆盖reshttps.request回调范围-阻止您使用所有的好东西(如:res.view)通过提供res传递给控制器的参数.

我想你有必要阅读闭包和回调:

什么是闭包和回调?