Node.js的新手,我正在从网站上的一些教程和其他帖子中慢慢拼凑出来。
目前,我正在尝试通过https模块发出API请求,并在客户端中使用返回的值(身份验证令牌)作为轻量级示例。
我当前的尝试非常简单 - 在按下按钮时调用客户端js函数,这会对节点服务器路由器进行Ajax调用。
我遇到的问题是我似乎无法从客户端的服务器检索数据。这可能是事件处理或我不完全理解的一些异步行为的问题 - 我试图检索的值可以在我调用的login()
函数中看到。具体来说,我在data
值中看到了这个令牌,我正在向控制台写出来(参见api.js
)我当前的方法中有什么突出显然是错误的吗?
提前感谢您提供的任何帮助。
对于上下文,App.js是我存储此路由以及启动服务器的地方。然后我通过来自client.js的ajax调用来使用api.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);
}
});
});
});
答案 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));;
});