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

Node.js是新手,我正在从网站上的许多教程和其他文章中慢慢拼凑出一些东西。

目前,我试图通过https模块进行API请求,并在客户端中使用返回值(身份validation令牌)作为轻量级示例。

我目前的尝试是非常简单的 – 一个客户端js函数被调用一个button按下,这使一个节点服务器路由器的Ajax调用。

我遇到的问题是,我似乎无法从客户端的服务器检索数据。 这可能是一个事件处理或一些asynchronous行为,我不完全理解的问题 – 我想要检索的值可以在我所调用的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); } }); }); }); 

你的api.login没有返回令牌,而是返回performRequest返回的值, undefined

就像你说的那样,它与login的asynchronous行为有关,它需要通过承诺或callback来返回令牌

例如一个承诺:

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