2016-06-09 3 views
1

Новое для Node.js, и я медленно собираю вещи из нескольких учебников и других сообщений здесь.Node.js + express - получение данных на стороне сервера у клиента

В настоящее время я пытаюсь сделать запрос API с помощью модуля https и использовать возвращаемое значение (токен аутентификации) для клиента для легкого примера.

Моя текущая попытка очень проста - функция js на стороне клиента вызывается нажатием кнопки, что делает вызов Ajax маршрутизатору узла-сервера.

Проблема, с которой я столкнулась, состоит в том, что я не могу получить данные с сервера на клиенте. Это может быть проблема обработки событий или какого-либо асинхронного поведения, которое я не совсем понимаю - значение, которое я пытаюсь получить, можно увидеть в функции login(), которую я вызываю. В частности, я вижу этот токен в значении data, которое я пишу на консоль (см. api.js). Что-нибудь из моего нынешнего подхода выделяется как очень плохое?

Благодарим вас за любую помощь, которую вы могли бы предложить.

Для контекста App.js - это место, где я храню этот маршрут, а также запуска сервера. Затем я использую модуль api.js с помощью вызова ajax от client.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); 
      } 
     }); 
    }); 
}); 
+0

Возможно, вы можете попробовать res.send() вместо end(). Из экспресс-документов: «Используйте, чтобы быстро закончить ответ без каких-либо данных. Если вам нужно отвечать данными, вместо этого используйте такие методы, как res.send() и res.json()». – bpinhosilva

ответ

1

Вашего api.login не возвращает маркер, это возвращение, что performRequest возвращается, undefined

Как вы сказали, что что-то делать с асинхронным поведением входа, он должен вернуть маркер через обещание или обратный вызов

пример с обещанием:

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));; 
}); 
+1

В примере обещания я бы сделал функцию выполненияRequestFunction, чтобы вернуть Promise вместо обратного вызова, а затем export.login = выполнитьRequestFunction. Зачем смешивать обратные вызовы и обещания в одном коде? –

+0

Спасибо за помощь! – devKev

Смежные вопросы