Node.js + express - 在客户端检索服务器端数据

时间:2016-06-09 22:23:20

标签: node.js express

Node.js的新手,我正在从网站上的一些教程和其他帖子中慢慢拼凑出来。

目前,我正在尝试通过https模块发出API请求,并在客户端中使用返回的值(身份验证令牌)作为轻量级示例。

我当前的尝试非常简单 - 在按下按钮时调用客户端js函数,这会对节点服务器路由器进行Ajax调用。

我遇到的问题是我似乎无法从客户端的服务器检索数据。这可能是事件处理或我不完全理解的一些异步行为的问题 - 我试图检索的值可以在我调用的login()函数中看到。具体来说,我在data值中看到了这个令牌,我正在向控制台写出来(参见api.js)我当前的方法中有什么突出显然是错误的吗?

提前感谢您提供的任何帮助。

对于上下文,App.js是我存储此路由以及启动服务器的地方。然后我通过来自client.js的ajax调用来使用api.js模块。

project layout

//app.js
var express = require('express');
var app = express();
var api = require('./public/api.js');

app.post('/login', function(req, res) {
    //token has no value currently, but along the lines of what I'm hoping to accomplish
    var token = api.login();        
    res.end(token);
});

app.use(express.static(__dirname + '/public'));

var server = app.listen(9001, function() {
    console.log('Listening on port 9001');
});

//api.js (node module)
var exports = module.exports = {};
var querystring = require('querystring');
var https = require('https');

var host = 'api.robinhood.com';
var username = '[username here]';
var password = '[password here]';
var response = null;

function performRequest(endpoint, method, data, success) {
  var dataString = JSON.stringify(data);
  var headers = {};

  if (method == 'GET') {
    endpoint += '?' + querystring.stringify(data);
  }
  else {
    headers = {
      'Content-Type': 'application/json',
      'Content-Length': dataString.length
    };
  }
  var options = {
    host: host,
    path: endpoint,
    method: method,
    headers: headers
  };

  var req = https.request(options, function(res) {
    res.setEncoding('utf-8');

    var responseString = '';

    res.on('data', function(data) {
      responseString += data;
    });

    res.on('end', function() {
      var responseObject = JSON.parse(responseString);
      success(responseObject);
    });
  });

  req.write(dataString);
  req.end();
}

exports.login = function() {
  return performRequest('/api-token-auth/', 'POST', {
    username: username,
    password: password
  }, function(data) {
    sessionId = data.token;
    console.log('Logged in:', sessionId);
  });
}

<!-- index.html -->
<!DOCTYPE html>
<html>
<script type="text/javascript" src="jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="client.js"></script>
<head>
    <title>Making API Calls!</title>
</head>
<body>
    <button id="login">Log in</button>
    <hidden id="token">Put an authentication token here</hidden>
</body>
</html>

//client.js
$(function(){
    $('#login').click(function() {
        $.ajax({
            type: 'POST',
            url: 'http://localhost:9001/login',
            contentType: "application/json; charset=utf-8",
            datatype: 'json',
            success: function(result) {
                console.log(result); // this is where I would consume/store the token
                $('#login').html(':)');
            },
            error: function(result) {
                console.log(status);
                console.log(result);
            }
        });   
    });
});

1 个答案:

答案 0 :(得分:1)

您的api.login未返回令牌,而是返回performRequest返回的内容,undefined

就像你说它与登录的异步行为有关,它需要通过promise或回调返回令牌

承诺的例子:

exports.login = function() {
  return new Promise(function(resolve) {
      performRequest('/api-token-auth/', 'POST', {
        username: username,
        password: password
      }, function(data) {
        sessionId = data.token;
        console.log('Logged in:', sessionId);
        resolve(sessionId);
      });
    }
  });
}

app.post('/login', function(req, res) {
  api.login()
    .then(token => res.end(token))
    .catch(err => res.end(err));;
});