2015-06-17 57 views
0

我使用express來創建一個webservice,它將從流中讀取字符串數據,並使用該值響應HTTP POST請求。這裏是定義readFileFromS3(.)函數爲S3Store.js文件的代碼:流讀取返回nodejs中的空

S3Store.js現在

S3Store.prototype.readFileFromS3 = function(filename, callback) { 
var readConfig = { 
    'Bucket': 'shubham-test', 
    'Key': filename 
}; 
var readStream = this.s3.getObject(readConfig).createReadStream(); 
var allData = ''; 

readStream.on('data', function(data) { 
    //data = Buffer.concat([allData, data]); 
    data = allData + data; 
    console.log("data: " + data); 
}); 

readStream.on('error', function(err) { 
    callback(err, null); 
}); 

,如果我請從終端此方法是這樣的:

s3Instance.readFileFromS3('123.json', function(err, data) { 
    console.log(data); 
}); 

我看到登錄到控制檯的適當的字符串data。但是,如果我從routes中的某個快速請求HTTP POST請求中調用相同的方法,則該服務響應的值爲data設置爲空字符串。對於POST請求代碼:

router.post('/resolve', function(req, res) { 
    var commandJson = req.body; 

    var appId = commandJson['appId']; 
    var command = commandJson['text']; 

    if (appId == undefined || command == undefined) { 
     res.status(400).send("Malformed Request: appId: " + appId + ", command: " + command); 
    }; 

    s3Store.readFileFromS3('123.json', function(err, data) { 
     res.send(data); 
    }); 
}); 

調用從HTTP POST方法readFileFromS3(.)而不是當我跑到離節點控制檯直接同樣的方法爲什麼它返回一個空字符串?

回答

1

你記錄的數據,但你不能傳遞任何內容到完成回調(參見下面的一些說明):

S3Store.prototype.readFileFromS3 = function(filename, callback) { 
    var readConfig = { 
     'Bucket': 'shubham-test', 
     'Key': filename 
    }; 
    var readStream = this.s3.getObject(readConfig).createReadStream(); 
    var allData = []; 

    // Keep collecting data. 
    readStream.on('data', function(data) { 
    allData.push(data); 
    }); 

    // Done reading, concatenate and pass to completion callback. 
    readStream.on('end', function() { 
    callback(null, Buffer.concat(allData)); 
    }); 

    // Handle any stream errors. 
    readStream.on('error', function(err) { 
    callback(err, null); 
    }); 
}; 

我冒昧地重寫數據採集使用緩衝區,而不是的字符串,但這顯然不是要求。

callback參數是一個完成函數,意味着在完成讀取S3流或調用錯誤時調用它。錯誤處理已經到位,但不是讀取流中所有數據時要回撥的部分,這就是爲什麼我添加了處理程序的原因。

在這一點上,readStream耗盡(一切從已讀入allData),並調用完成回調時收集到的數據作爲第二個參數

整個Node中常見的習慣用法是,完成回調需要(至少)兩個參數:第一個是錯誤,或者在沒有錯誤的情況下爲null,第二個是您想要傳回的數據調用者(在你的情況下,你的路由處理器中的匿名函數調用res.send())。

+0

我用你的readFileFromS3()方法的版本,它工作得很好。然而,對於Nodejs來說,我是新手 - 你能否詳細說明「但是你沒有把任何事情傳遞給完成回調」? –

+1

@ Shubham.Shukla我加了一些解釋。 – robertklep