Новое для Node.js, и я медленно собираю вещи из нескольких учебников и других сообщений здесь.Node.js + express - получение данных на стороне сервера у клиента
В настоящее время я пытаюсь сделать запрос API с помощью модуля https и использовать возвращаемое значение (токен аутентификации) для клиента для легкого примера.
Моя текущая попытка очень проста - функция js на стороне клиента вызывается нажатием кнопки, что делает вызов Ajax маршрутизатору узла-сервера.
Проблема, с которой я столкнулась, состоит в том, что я не могу получить данные с сервера на клиенте. Это может быть проблема обработки событий или какого-либо асинхронного поведения, которое я не совсем понимаю - значение, которое я пытаюсь получить, можно увидеть в функции login()
, которую я вызываю. В частности, я вижу этот токен в значении data
, которое я пишу на консоль (см. api.js
). Что-нибудь из моего нынешнего подхода выделяется как очень плохое?
Благодарим вас за любую помощь, которую вы могли бы предложить.
Для контекста App.js - это место, где я храню этот маршрут, а также запуска сервера. Затем я использую модуль api.js с помощью вызова ajax от client.js.
//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);
}
});
});
});
Возможно, вы можете попробовать res.send() вместо end(). Из экспресс-документов: «Используйте, чтобы быстро закончить ответ без каких-либо данных. Если вам нужно отвечать данными, вместо этого используйте такие методы, как res.send() и res.json()». – bpinhosilva