2017-10-05 1 views
1

javascript 용 aws-sdk를 사용하고 있습니다. 다시 독립 실행 형 프로그램aws-sdk nodejs 프로그램을 깨기

//program.js 

const AWS = require('aws-sdk'); 
const firehose = new AWS.Firehose({ 
    accessKeyId: "XXX", 
    secretAccessKey: "YY" 
}); 

const params = { 
    DeliveryStreamName: 'demo1', 
    Record: { 
    Data: new Buffer("Hello World") 
    } 
}; 

firehose.putRecord(params, function (err, data){ 
    if (err) { 
    console.log(err); 
    return; 
    } 
    console.log(data);   // successful response 
}); 

에 사용하는 경우

아래 코드는 잘 작동, 위의 코드는 독립 실행 형 파일로 잘 작동합니다. 데이터가 Firehose로 밀린 다음 Redshift로 내려갑니다. 그래서 내가 Redshift에 내 데이터를 볼 수 있어요

node program.js 

실행합니다. 예! !!

=============================는

그러나, 내가 정말 달성하고자하는 데이터를 밀어하는 것입니다 특정 경로가 내 명시 적 응용 프로그램에 부딪히면 Firehose.

```

: 그래서 위와 동일한 코드를 가지고 내 경로에 붙여

// router.js 
const AWS = require('aws-sdk'); 
const firehose = new AWS.Firehose({ 
    accessKeyId: "XXX", 
    secretAccessKey: "YY" 
}); 

router 
    .get('/v1/locations/:id?', (req, res) => { 

    const params = { 
    DeliveryStreamName: 'demo1', 
    Record: { 
     Data: new Buffer("Hello World") 
    } 
    }; 

    firehose.putRecord(params, function (err, data){ 
    if (err) { 
     console.log(err); 
     return; 
    } 
     console.log(data);   

    }); 

    // do the work that needs to be done for this route and send a response 
    res.send("some data"); 

    }); 

firehose.putRecord이 실행되는 분 .. 다음과 같은 오류와 함께 내 프로그램을 충돌

TypeError: doneCallback.cal is not a function 
    at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:115:18) 
    at callNextListener (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:95:12) 
    at /api-project/node_modules/aws-sdk/lib/event_listeners.js:74:9 
    at finish (/api-project/node_modules/aws-sdk/lib/config.js:315:7) 
    at /api-project/node_modules/aws-sdk/lib/config.js:333:9 
    at Credentials.get (/api-project/node_modules/aws-sdk/lib/credentials.js:126:7) 
    at getAsyncCredentials (/api-project/node_modules/aws-sdk/lib/config.js:327:24) 
    at Config.getCredentials (/api-project/node_modules/aws-sdk/lib/config.js:347:9) 
    at Request.VALIDATE_CREDENTIALS (/api-project/node_modules/aws-sdk/lib/event_listeners.js:69:26) 
    at Request.callListeners (/api-project/node_modules/aws-sdk/lib/sequential_executor.js:101:18) 

이 코드가 왜 내 익스프레스 프로그램과 충돌하는지 이해할 수 없습니다. 이것은 aws-sdk 라이브러리의 버그입니까, 아니면 제가 잘못하고있는 것입니까?

+0

마지막으로 문제를 파악했습니다. aws-sdk가 제대로 설치되지 않았습니다 (어떻게 될지 궁금합니다). 115 번 줄의 sequential_executor.js 파일에 .. ** doneCallback.call ** 문이 있습니다. 그러나 내 파일에서 그 문장은 ** doneCallback.cal ** .. –

답변

1

성공적인 콜백에서 명시적인 응답을 보내야합니다.

firehose.putRecord(params, function (err, data) { 
    if (err) { 
    console.log(err); 
    return; 
    } 
    console.log(data);   
    res.send("some data"); 
    } 
); 
0

참고로 res.send(data)은 실제로 프로그램을 종료하고 데이터를 전송합니다. 그러나 putRecord 콜백은 이탈이 발생해야하는 시간입니다. 노드에서는 코드의 위에서 아래로 순서대로 발생하지 않지만 대신 콜백 이벤트의 순서대로 실행됩니다. 그래서 당신의 코드 실행 흐름은 다음과 같이 될 것이다 :

  1. 파일은 실행
  2. 어떤 작업이 수행 작업에 대한
  3. 콜백 프로그래머 추가 코드는 외부의 조작하면
  4. 다음, 그것을 계속 발생되고, 그렇지 않으면 해당 콜백에서 코드가 종료됩니다. 따라서 putRecord 콜백에 res.send을 넣으십시오.
+0

res.send (data)가되어야합니다. 프로그램을 종료하지 마십시오. 결국이 서버는 연중 무휴로 운영되는 익스프레스 서버입니다. putRecord는 비동기 활동이기 때문에 eventQueue에 푸시되고이 이벤트가 완료 될 때마다 콜백이 실행되어야한다고 생각합니다. –