【问题标题】:SSL connection with node.js与 node.js 的 SSL 连接
【发布时间】:2012-08-03 06:00:42
【问题描述】:

我已经厌倦了尝试自己解决这个问题。我正在尝试让股票市场 api 正常工作,为此,我需要一个 ssl 连接。唉,我得到的只是错误或奇怪的东西。

当我像这样使用普通节点的“net”模块连接到套接字时:

var net = require('net');
var data = '';
var login = '{"cmd":"login", "args":{"session_key":"' + session_key + '", "service":"NEXTAPI"}} \n';
var socket = new net.Socket();
socket.connect(443, 'pub.api.test.nordnet.se', function () {
    console.log('Connected');
});
socket.on('data', function (stuff) {
    console.log(stuff.toString);
    data += stuff;
});
socket.on('end', function () {
    console.log(data);
});
socket.on('error', function (e) {
    throw e;
});
socket.on('close', function () {
    console.log('Connection closed.');
    console.log(data.toString);
});
socket.write(login , function () {
    console.log("Callback");
});

首先一切正常,我收到“已连接”消息,我很高兴,但是当我尝试进行实际登录时,我进入控制台的只是“[Function]”,然后是“Connection”关闭”。是的,似乎来自服务器的数据只是“[Function]”。这有点奇怪。编辑:现在我知道我为什么得到它了,谢谢 Amberlamps。虽然问题仍然存在。

好的,所以我用其他一些方法尝试了同样的事情。这是我使用 socket.io-client 的代码。

var client = io_client.connect('https://pub.test.api.nordnet.se:443', {secure: true});
client.on('data', function (stuff) {
    console.log (stuff);
});
client.on('error', function (e) {
    throw e;
});
client.on('end', function () {
    console.log('Connection ended');
});

我得到的只是“错误:getaddrinfo ENOENT”。无论我尝试做什么,这似乎都是同样的错误,将主机名更改为吃喝玩乐或将 https 更改为 http 或完全删除它,或者上帝知道我尝试了什么。

好的...这是我的最后一次尝试,我虽然可能,只是可能,他们确实需要认证,而我没有使用它。所以这是我使用节点的 tls 模块的另一段代码:

var tls = require ('tls');
var fs = require ('fs');

var options = {
host: 'pub.api.test.nordnet.se',
port: '443',
key: fs.readFileSync('NEXTAPI_TEST_public.pem'),
cert: fs.readFileSync('NEXTAPI_TEST_public.der')
};

var Stream = tls.connect(options, function () {
    console.log('client connected', Stream.authorized ? 'authorized' : 'unauthorized');
    process.stdin.pipe(Stream);
    process.stdin.resume();
});
Stream.on('data', function (stuff) {
    console.log(stuff);
});
Stream.on('end', function () {
    console.log('END');
});
Stream.on('error', function (err) {
    throw err;
});

但它甚至没有进入认证部分,它给我的只是“错误:连接 EADDRNOTAVAIL”。我再次尝试将名称、端口、https 更改为 hppt 等,但我得到的只是同样的错误。哦,你可能会认为我的主机名有一个错误,但不,我使用不同的技术从同一个 api 获取该主机名和端口,但我需要这个也工作才能取得进展。

现在请有人给我一些关于这个问题的见解。如果您发现我可以对这三段代码中的任何一段进行改进,我会尝试这样做。

编辑(1): 如果我尝试只使用普通的 https 而不是套接字,会发生以下情况。

var https = require ('https'); 
var options = {
host: 'pub.api.test.nordnet.se',
path: '/',
port: '443', 
auth: session_key + ':' + session_key, // Tried with and without this.
headers: {"Accept": "application/json", "Connection": "Keep-Alive"}
};

var request = https.get(options, function (res) {
    res.on('data', function (stuff) {
        console.log(stuff)
    });
    res.on('end', function () {
        console.log("END");
    });
})
.on('error', function (e) {
    throw e;
});

我得到的只是“错误:套接字挂起”。或者,如果我指定 https://pub.api... 我得到“错误:getaddrinfo ENOENT”。

【问题讨论】:

  • 您将在控制台中获得[Function],因为stuff.toString 是一个函数。您可能想要执行该函数:console.log(stuff.toString());
  • 好的,我现在明白了。虽然它没有多大帮助,但现在我得到的只是节点自己的缓冲区,它没有给我任何信息。如果我在 socket.on('close') 上打印它时没有 .toString,它只会打印出……呃……§♥☻☻。是的。那。你执行这个函数是什么意思?如果我执行 .toString 然后打印它,它只会给出相同的 §♥ ☻☻。
  • toString 与第一个参数完全相同,如果它是字符串类型的话。 “错误:getaddrinfo ENOENT”表示 Node 无法解析给定的主机。如果 NS 或类似信息有误或被主动屏蔽,就会发生这种情况。

标签: javascript sockets node.js ssl socket.io


【解决方案1】:

在以下位置有一个新的 Node 示例: https://api.test.nordnet.se/projects/api/wiki/Code_examples#Login-and-feed-example-in-Nodejs

您基本上需要使用 rest 登录,然后使用会话密钥登录到提要。

【讨论】:

    【解决方案2】:

    由于这是一个 REST api,因此使用 https 模块的尝试是正确的。但是,根据文档,您应该尝试连接到“https://api.test.nordnet.se/next/1”。 '1' 是 API 版本。这应该可以解释 ENOENT / 连接重置。

    查询这将返回您的 api 状态。下一步是登录。

    我在这里找到了一个非常好的 Python 示例:https://api.test.nordnet.se/boards/2/topics/297?r=340#message-340

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多