繁体   English   中英

将数组作为引用类型node.js

[英]passing array as reference type node.js

我正在连接到S3并解析出一个json文件,
我创建了一个名为Singer的新对象和一个对象数组。 我想在功能范围之外使用此对象数组

console.log("Loading up the best code ever!!!");

var fs = require('fs');
// Load the SDK for JavaScript
var AWS = require('aws-sdk');
var jsonfile = require('jsonfile')
var Singer = require('./Singer')
// Set the region 
AWS.config.update({ region: "us-west-1" });
var credentials = new AWS.SharedIniFileCredentials();
AWS.config.credentials = credentials;
// Create S3 service object
s3 = new AWS.S3({ apiVersion: '2006-03-01' });
console.log("after S3");


// Create the parameters for calling createBucket
var bucketParams = {
    Bucket: 'pc-backend-exercises',
    Key: 'toSearch.json',
    ResponseContentType: 'application/json'
};
s3.getObject(bucketParams, function (err, data) {
    // Handle any error and exit
    if (err) {
        console.log(err, err.stack); 
        return err;
    }
    var fileContents = data.Body.toString();
    var json = JSON.parse(fileContents);
    console.log(json);

    var singers = [];
    for (var i = 0; i < json.Search.artists.length; i++) {
        var newSinger = new Singer(json.Search.artists[i]);
        singers.push(newSinger);
    }


    console.log('Singers:');
    console.log(singers);


});

console.log('download json file from s3');

此代码可以正常工作。 我得到了输出

Loading up the best code ever!!!
after S3
download json file from s3
{ Search: { artists: [ 'Katy', 'Madonna', 'Rihanna', 'Beyonce' ] } }
Singers:
[ Singer { name: 'Katy', songs: [] },
  Singer { name: 'Madonna', songs: [] },
  Singer { name: 'Rihanna', songs: [] },
  Singer { name: 'Beyonce', songs: [] } ]

但是,我更改代码以通过引用传递数组歌手的方法却行不通。

var singers = [];
s3.getObject(bucketParams, function (err, data, singers) {
    // Handle any error and exit
    if (err) {
        console.log(err, err.stack); 
        return err;
    }
    var fileContents = data.Body.toString();
    var json = JSON.parse(fileContents);
    console.log(json);


    for (var i = 0; i < json.Search.artists.length; i++) {
        var newSinger = new Singer(json.Search.artists[i]);
        singers.push(newSinger);
    }

});

console.log('Singers:');
console.log(singers);


console.log('download json file from s3');

输出为:

Loading up the best code ever!!!
after S3
Singers:
[]
download json file from s3
{ Search: { artists: [ 'Katy', 'Madonna', 'Rihanna', 'Beyonce' ] } }
C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:31
            throw err;
            ^

    TypeError: Cannot read property 'push' of undefined
        at Response.<anonymous> (C:\Users\gdarmon\Desktop\Node\gili.js:38:17)
        at Request.<anonymous> (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:364:18)
        at Request.callListeners (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\sequential_executor.js:105:20)
        at Request.emit (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\sequential_executor.js:77:10)
        at Request.emit (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:683:14)
        at Request.transition (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:22:10)
        at AcceptorStateMachine.runTo (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\state_machine.js:14:12)
        at C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\state_machine.js:26:10
        at Request.<anonymous> (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:38:9)
        at Request.<anonymous> (C:\Users\gdarmon\Desktop\Node\node_modules\aws-sdk\lib\request.js:685:12)

你能帮忙吗?

您在这里有两个问题。

错误讯息

无法读取未定义的属性“ push”

看这里:

 s3.getObject(bucketParams, function (err, data, singers) { 

singers是未定义的,因为您定义了一个称为singers的参数(它将在更大范围内屏蔽该变量)。 getObject函数在调用传递给它的匿名函数时不会给第三个参数赋值。

我不知道你为什么期望它。

如果删除该参数,则可以再次访问范围更广的singers变量。

执行顺序

这是一个常见问题解答。 请参阅如何从异步调用返回响应? 这可能是所有Stackoverflow上“以重复方式关闭”的前3个目标。

问题是变量的范围。 您已经在本地和全局中定义了相同的变量名。

更改局部变量的名称,它应该工作我有变化singers1

var singers = [];
s3.getObject(bucketParams, function (err, data, singers1) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM