Добавьте возвращаемое значение асинхронного метода обратного вызова для записи ответа HTTP.с асинхронным обратным вызовом страница завершает загрузку, прежде чем я пишу ответ - PullRequest
0 голосов
/ 30 мая 2018

Я испытываю приложение сервера NodeJS для получения списка имен файлов (объектов) AWS S3 и возврата в виде текста ответа HTTP.

ниже приведен полный код, который я написал.

var AWS = require('aws-sdk');
var http = require("http");

function onRequest(request, response) {
    response.writeHead(200, {
        'Content-Type': 'application/json'
    });
    var credentials = new AWS.SharedIniFileCredentials();
    AWS.config.credentials = credentials;
    AWS.config.logger = console;
    var str = "";
    var s3 = new AWS.S3();
    var params = {
        Bucket: 'bucketname',
        Delimiter: '/',
        Prefix: 'path/to/the/folder'
    }
    //var data = s3.listObjectsV2(params);   returns data as [object Object]

    s3.listObjects(params, function(err, data) {
        console.log("Data : " + data);
        for (var i = 0; i < data.Contents.length; i++) {
            var tokens = data.Contents[i].Key.split("/");
            str = str + tokens[tokens.length - 1];
            if (i != data.Contents.length) {
                str = str + ",";
            }
        }
        console.log("Final text:" + str);
    });

    response.write(str);
    response.end();
}

http.createServer(onRequest).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');'

Проблема: из-за асинхронного вызова listObjects запись HTTP-ответа заканчивается до того, как я получу значение обратного вызова.

Может ли кто-нибудь помочь мне сделать его синхронным, чтобы я мог добавить str как часть тела ответа?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете просто поместить res.write и res.end в обратный вызов, который будет работать:

var AWS = require('aws-sdk'); var http = require("http");
function onRequest(request, response) { 
    response.writeHead(200, { 'Content-Type': 'application/json' }); 
    var credentials = new AWS.SharedIniFileCredentials(); 
    AWS.config.credentials = credentials; 
    AWS.config.logger = console; 
    var str = ""; 
    var s3 = new AWS.S3(); 
    var params = { Bucket: 'bucketname', Delimiter: '/', Prefix: 'path/to/the/folder' } 
    //var data = s3.listObjectsV2(params); 
    returns data as [object Object]

    s3.listObjects(params, function(err, data) {
        console.log("Data : " + data);
        for (var i = 0; i < data.Contents.length; i++) {
            var tokens = data.Contents[i].Key.split("/");
            str = str + tokens[tokens.length - 1];
            if (i != data.Contents.length) {
                str = str + ",";
            }
        }
        console.log("Final text:" + str);

        response.write(str); // And putting response write() and end() here
        response.end();
    });

    // taking off write() and end() from here

}

http.createServer(onRequest).listen(8081); 
console.log('Server running at http://127.0.0.1:8081/');
0 голосов
/ 30 мая 2018

Вам нужен только response.end(str), и он может перейти внутрь обратного вызова.Узел будет держать поток HTTP открытым, пока не вернется вызов S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...