从没有未定义引用 NodeJS 的类函数返回变量

Return a Variable from a class function without Undefinided Reference NodeJS

提问人:Julian Wise 提问时间:1/2/2018 最后编辑:KARTHIKEYAN.AJulian Wise 更新时间:1/2/2018 访问量:531

问:

每次我尝试从类中分配变量时,我都无法使用它。

然后,当我制作一个小示例代码以放到网上时,这些函数在小示例中起作用。从类中返回变量后,如何将变量记录到屏幕上?

在小代码示例中,在实际执行操作的较大代码中,我收到一个未定义的引用错误,可能是因为函数需要更长的时间才能运行。

使用像这样的 main.js:

var KeyPair = require('./Keypair');
var Q = require("q");
path_k = __dirname + "/user_p_key_1.txt";
var pair = new KeyPair();

var p = pair.getPublicKey(path_k);
console.log(p + " sig_1"); // error: logs "undefined sig_1" instead of key.

Q.fcall(p = pair.getPublicKey(path_k))
.then(console.log(p + " sig_2")); // error: logs "undefined sig_2" instead of key.

输出为:

undefined sig_1
undefined sig_2
Key fileread successfully
Is it a valid public key?
true
Key:GAVAPNTBWRG337JWZYLR2SBPD5KFA2PPXDMN4HEEBLWSZQIKTPOEFZL6
Key fileread successfully
Is it a valid public key?
true
Key:GAVAPNTBWRG337JWZYLR2SBPD5KFA2PPXDMN4HEEBLWSZQIKTPOEFZL6
Key fileread successfully
Is it a valid public key?
true
Key:GAVAPNTBWRG337JWZYLR2SBPD5KFA2PPXDMN4HEEBLWSZQIKTPOEFZL6

使用密钥对.js类:

var fs = require('fs');
var StellarBase = require('stellar-base');
var StellarSdk = require('stellar-sdk');

// A class for referencing KeyPair methods to read and write from files
var method = KeyPair.prototype;

function KeyPair() {
}

method.getPublicKey = function(path_k) {

    // Read PublicKey from filename
    fs.open(path_k, 'r', function(err, fd) {  
        if (err) {
            throw 'could not open file: ' + err;
        }
        // Buffer Array Initialised for the Public Key
        // write the contents of the buffer, from position 0 to the end, to the file descriptor returned in opening our file
        var arr = [null,null,null,null,null,null,null,null,null,null,null,null,
                    null,null,null,null,null,null,null,null,null,null,null,null,
                    null,null,null,null,null,null,null,null];
        var buffer_k = Buffer.from(arr);
        fs.read(fd, buffer_k, 0, buffer_k.length, null, function(err) {
            if (err) throw 'error reading file: ' + err;
            fs.close(fd, function() {
                //console.log('Key fileread successfully');
                var user_encoded_k = StellarBase.StrKey.encodeEd25519PublicKey(buffer_k);
                //console.log('Is it a valid public key?');
                //console.log(StellarBase.StrKey.isValidEd25519PublicKey(user_encoded_k));
                //console.log('Key:' + user_encoded_k);
                return user_encoded_k
            });
        });
    });
};

读取公钥“user_p_key_1.txt”:

*¶a´M½ý6ÎH/TPiï¸ØÞ„
í,Á
݆B

密钥是测试服务器的密钥。

此外,我创建了简化的 Keypair.js,如下所示,以表明我的代码不起作用,并且示例 Keypair.js 的工作方式与上面的 Keypair.js 不同,并分配变量并将其正确记录到屏幕。

简化密钥对 .js

var fs = require('fs');

// A class for referencing KeyPair methods to read and write from files
var method = KeyPair.prototype;


function KeyPair() {
}

method.getPublicKey = function(value) {
    return 1
};

module.exports = KeyPair;

我认为这可能与异步解释器在调用变量时未完成函数有关,所以我后来在 promise 中实现了它,令我难以置信的是仍然返回未定义。我们如何从类函数中分配变量并在 Node.JS 中使用它?p

JavaScript 节点.js 异步 未定义引用

评论

2赞 MinusFour 1/2/2018
你是对的,因为它是一个异步问题,你也没有正确使用。Q
0赞 Julian Wise 1/2/2018
道歉!我尝试修改 Q Github 页面中的示例。您知道我在哪里可以找到正确使用 Q 来使用可变输出的参考吗?
1赞 MinusFour 1/2/2018
您需要返回一个 promise,github 页面提供了如何通过 deferreds 或 promise api 执行此操作的示例(最好使用这个)。getPublicKey
1赞 MinusFour 1/2/2018
Julian Wise,你的函数没有返回任何东西,因为它是异步的。这就是为什么它需要返回一个承诺。阅读这篇文章很重要。
1赞 SergGr 1/2/2018
@KARTHIKEYAN。答:我不认为随意将有效且广泛使用的英语单词更改为其他版本是一个好的编辑策略。修复错别字是可以的,欢迎。将拼写更改为您喜欢的拼写可能不是。此外,我不认为添加尽可能多的标签是有益的。我认为应该添加标签以提高 1) 潜在相关专家对问题的可发现性 2) 未来搜索类似问题的人的可发现性。如果添加标签没有帮助 - 则不应添加它。总而言之:只有当它真正提高质量时才进行编辑!

答: 暂无答案