gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:51 24 4
gpt4 key购买 nike

我是 Node.js 新手,我正在慢慢地将网站上的一些教程和其他帖子拼凑起来。

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

我当前的尝试非常简单 - 按下按钮时调用客户端 js 函数,从而对 Node 服务器路由器进行 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);
}
});
});
});

最佳答案

您的api.login没有返回 token ,而是返回performRequest返回的内容,未定义

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

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

关于Node.js + Express - 在客户端检索服务器端数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37737158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com