নোড.জেএস-এ এস 3 গেটঅবজেক্ট থেকে কীভাবে প্রতিক্রিয়া পাবেন?


90

নোড.জেএস প্রকল্পে আমি এস 3 থেকে ডেটা ফেরত পাওয়ার চেষ্টা করছি।

যখন আমি ব্যবহার করি getSignedURL, সমস্ত কিছু কাজ করে:

aws.getSignedUrl('getObject', params, function(err, url){
    console.log(url); 
}); 

আমার প্যারামগুলি হ'ল:

var params = {
              Bucket: "test-aws-imagery", 
              Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par"

যদি আমি URL আউটপুট কনসোলে নিয়ে যাই এবং এটি একটি ওয়েব ব্রাউজারে পেস্ট করি তবে এটি আমার প্রয়োজনীয় ফাইলটি ডাউনলোড করে download

যাইহোক, আমি যদি চেষ্টা করার চেষ্টা করি তবে আমি getObjectসমস্ত প্রকারের বিজোড় আচরণ পেতে পারি। আমি বিশ্বাস করি যে আমি এটি ভুলভাবে ব্যবহার করছি। এটি আমি চেষ্টা করেছি:

aws.getObject(params, function(err, data){
    console.log(data); 
    console.log(err); 
}); 

ফলাফল:

{ 
  AcceptRanges: 'bytes',
  LastModified: 'Wed, 06 Apr 2016 20:04:02 GMT',
  ContentLength: '1602862',
  ETag: '9826l1e5725fbd52l88ge3f5v0c123a4"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  Body: <Buffer 01 00 00 00  ... > }

  null

সুতরাং দেখা যাচ্ছে যে এটি সঠিকভাবে কাজ করছে। যাইহোক, আমি যখন কোনও একটিতে ব্রেকপয়েন্ট রাখি, তখন console.logআমার আইডিই (নেটবিয়ানস) একটি ত্রুটি ছুড়ে দেয় এবং ডেটার মান প্রদর্শন করতে অস্বীকার করে। যদিও এটি কেবল আইডিই হতে পারে, আমি অন্য উপায় ব্যবহারের চেষ্টা করার সিদ্ধান্ত নিয়েছি getObject

aws.getObject(params).on('httpData', function(chunk){
    console.log(chunk); 
}).on('httpDone', function(data){
    console.log(data); 
});

এটি কিছুই আউটপুট দেয় না। ব্রেকআপপয়েন্ট স্থাপন করে দেখায় যে কোডটি কখনই console.logএস এর মধ্যে পৌঁছায় না । আমি চেষ্টাও করেছি:

aws.getObject(params).on('success', function(data){
    console.log(data); 
});

তবে এটি কোনও কিছুই আউটপুট দেয় না এবং ব্রেকপয়েন্ট রাখলে বোঝা যায় যে এটি console.logকখনই পৌঁছেছে না।

আমি কি ভুল করছি?


আপনার awsবিষয়বস্তু আসলে কি বস্তুর নতুন উদাহরণ aws.S3? এছাড়াও, কোনও প্রতিক্রিয়া কি getObject()কোনও HTTP প্রতিক্রিয়ায় ফেরত দেওয়া থেকে বা এটি কোনও ফাইলে পাইপ করা হচ্ছে?
পেটব

@peteb aws = new AWS.S3()। প্রতিক্রিয়া কোনও ফাইলে পাইপ করা উচিত নয়। আমার এটি জাভাস্ক্রিপ্ট
সারা তিব্বেটস

তাহলে বিষয়গুলি JSON বা এক্সএমএল হয় তা অনুমান করা কি নিরাপদ?
পেটব

@ পেটেব উভয়ই নয়, এগুলি একটি কাস্টম ফাইল ফর্ম্যাট
সারা তিব্বেটস

আপনি getObject()কলটিতে যে প্যারামগুলি ব্যবহার করছেন তা দেখান । আপনি যদি ওবজেক্ট পেতে স্বাক্ষরিত ইউআরএল পাস করার চেষ্টা করছেন তবে আমি মনে করি না এটি কার্যকর হবে will
মার্ক

উত্তর:


177

getObject()এস 3 এপিআই থেকে কোনও কাজ করার সময় , দস্তাবেজগুলি অনুসারে আপনার ফাইলের বিষয়বস্তু Bodyসম্পত্তিটিতে থাকে যা আপনি আপনার নমুনা আউটপুট থেকে দেখতে পারবেন। আপনার এমন কোড থাকা উচিত যা নীচের মতো কিছু দেখায়

const aws = require('aws-sdk');
const s3 = new aws.S3(); // Pass in opts to S3 if necessary

var getParams = {
    Bucket: 'abc', // your bucket name,
    Key: 'abc.txt' // path to the object you're looking for
}

s3.getObject(getParams, function(err, data) {
    // Handle any error and exit
    if (err)
        return err;

  // No error happened
  // Convert Body from a Buffer to a String

  let objectData = data.Body.toString('utf-8'); // Use the encoding necessary
});

আপনাকে data.Bodyঅবজেক্ট থেকে নতুন বাফার তৈরি করতে হবে না তবে আপনার যদি প্রয়োজন হয় তবে তা অর্জন করতে আপনি উপরের নমুনাটি ব্যবহার করতে পারেন।


সুতরাং ফিরে আসা ডেটা মনে হচ্ছে এমন একটি Bufferঅবজেক্ট, যার সাথে আমি পরিচিত নই। তাত্ত্বিকভাবে আমি new Buffer(data.Body).toString('utf-8');সামগ্রীটি পেতে ব্যবহার করতে পারি?
সারা টিবিবেটস

4
যদি সামগ্রীটি ইতিমধ্যে বাফার হয় তবে সেখান থেকে কোনও নতুন বাফার তৈরি করার দরকার নেই। সহজভাবে শুধু data.Body.toString('utf-8');। একটি বাফার নোডে বাইনারি ডেটার উপস্থাপনা, আপনার যদি আরও তথ্যের প্রয়োজন হয় তবে
ডকগুলি

4
এটি পাঠ্যের জন্য কাজ করে, তবে .png, .jpg, ইত্যাদির পাশাপাশি পাঠ্য ফাইলগুলি পরিচালনা করার জন্য কি সাধারণ সমাধান রয়েছে?
কার্টার 21

4
@ কার্টার এটি একটি সাধারণ সমাধান। আপনি যদি চিত্রগুলির জন্য বাইনারি স্ট্রিং চান তবে কেবল .toString('utf8')অ্যাক্সেস data.Bodyকরার সময় পরিবর্তন করুন .toString('binary')। তাহলে Bufferdata.Bodyএই প্রশ্নের মত একটি স্ট্রিং রূপান্তরিত করার জন্য দরকার নেই, তাহলে আপনি ঠিক আসতে পারেন data.Bodyএবং কাজ Bufferসরাসরি।
পেটব

4
"বাফার থেকে একটি স্ট্রিংয়ে বডি রূপান্তর করুন" ... এডাব্লুএস ডক্স এটিকে কিছুটা আরও পরিষ্কার করে দিলে দুর্দান্ত হবে। আমি এডাব্লুএস-এর সাথে কুস্তিতে বেশ ক্লান্ত হয়ে পড়ছি।
অসুলিক

30

@ পেটেবের উত্তরের ভিত্তিতে, তবে ব্যবহার Promisesএবং Async/Await:

const AWS = require('aws-sdk');

const s3 = new AWS.S3();

async function getObject (bucket, objectKey) {
  try {
    const params = {
      Bucket: bucket,
      Key: objectKey 
    }

    const data = await s3.getObject(params).promise();

    return data.Body.toString('utf-8');
  } catch (e) {
    throw new Error(`Could not retrieve file from S3: ${e.message}`)
  }
}

// To retrieve you need to use `await getObject()` or `getObject().then()`
getObject('my-bucket', 'path/to/the/object.txt').then(...);

4
GetObject () এর শেষে .Pomise () আমার জন্য চাবিকাঠি। আমি এডাব্লুএস এসডিকে মাঝে মাঝে কিছুটা অপ্রয়োজনীয় পাই।
অ্যান্ড্রু হ্যারিস 21

আমার প্রতিক্রিয়া বলছে 'প্রতিশ্রুতি দিন p <
pend

4
@ জোনাস্ক getObject()একটি অ্যাসিঙ্ক ফাংশন, আপনি কি এটির সাথে কল করার চেষ্টা করেছিলেন await getObject(...)?
আরিয়ান অ্যাকোস্টা

6

NEST JS TYPESCRIPTউপরের সংস্করণ খুঁজছেন এমন কারও জন্য :

    /**
     * to fetch a signed URL of a file
     * @param key key of the file to be fetched
     * @param bucket name of the bucket containing the file
     */
    public getFileUrl(key: string, bucket?: string): Promise<string> {
        var scopeBucket: string = bucket ? bucket : this.defaultBucket;
        var params: any = {
            Bucket: scopeBucket,
            Key: key,
            Expires: signatureTimeout  // const value: 30
        };
        return this.account.getSignedUrlPromise(getSignedUrlObject, params);
    }

    /**
     * to get the downloadable file buffer of the file
     * @param key key of the file to be fetched
     * @param bucket name of the bucket containing the file
     */
    public async getFileBuffer(key: string, bucket?: string): Promise<Buffer> {
        var scopeBucket: string = bucket ? bucket : this.defaultBucket;
        var params: GetObjectRequest = {
            Bucket: scopeBucket,
            Key: key
        };
        var fileObject: GetObjectOutput = await this.account.getObject(params).promise();
        return Buffer.from(fileObject.Body.toString());
    }

    /**
     * to upload a file stream onto AWS S3
     * @param stream file buffer to be uploaded
     * @param key key of the file to be uploaded
     * @param bucket name of the bucket 
     */
    public async saveFile(file: Buffer, key: string, bucket?: string): Promise<any> {
        var scopeBucket: string = bucket ? bucket : this.defaultBucket;
        var params: any = {
            Body: file,
            Bucket: scopeBucket,
            Key: key,
            ACL: 'private'
        };
        var uploaded: any = await this.account.upload(params).promise();
        if (uploaded && uploaded.Location && uploaded.Bucket === scopeBucket && uploaded.Key === key)
            return uploaded;
        else {
            throw new HttpException("Error occurred while uploading a file stream", HttpStatus.BAD_REQUEST);
        }
    }

4

বিকল্পভাবে আপনি minio-js ক্লায়েন্ট লাইব্রেরি get-object.js ব্যবহার করতে পারেন

var Minio = require('minio')

var s3Client = new Minio({
  endPoint: 's3.amazonaws.com',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY'
})

var size = 0
// Get a full object.
s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) {
  if (e) {
    return console.log(e)
  }
  dataStream.on('data', function(chunk) {
    size += chunk.length
  })
  dataStream.on('end', function() {
    console.log("End. Total size = " + size)
  })
  dataStream.on('error', function(e) {
    console.log(e)
  })
})

দাবি অস্বীকার : আমি মিনিও এর ওপেন সোর্স, জাভা , পাইথন , জেএস , গোলংয়ে ক্লায়েন্ট লাইব্রেরি সহ গোলংয়ে লিখিত S3 সামঞ্জস্যপূর্ণ অবজেক্ট স্টোরেজের জন্য কাজ করি


মিনো চেষ্টা করা হয়েছে, তবে কীভাবে বাফার ডেটা পাবেন, যখন আমি ডেটা স্ট্রিম প্রিন্ট করি B অর্থাত্ কনসোল.লগ ('ডেটাস্ট্রিম', ডেটাস্ট্রিম.বডি); // অপরিবর্তিত
দ্বিবিশ

3

প্রথম নজরে দেখে মনে হচ্ছে না যে আপনি কোনও ভুল করছেন কিন্তু আপনি আপনার সমস্ত কোড প্রদর্শন করেন না। নিম্নলিখিতটি আমার জন্য কাজ করেছিল যখন আমি প্রথম এস 3 এবং নোডটি যাচাই করছিলাম:

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

if (typeof process.env.API_KEY == 'undefined') {
    var config = require('./config.json');
    for (var key in config) {
        if (config.hasOwnProperty(key)) process.env[key] = config[key];
    }
}

var s3 = new AWS.S3({accessKeyId: process.env.AWS_ID, secretAccessKey:process.env.AWS_KEY});
var objectPath = process.env.AWS_S3_FOLDER +'/test.xml';
s3.putObject({
    Bucket: process.env.AWS_S3_BUCKET, 
    Key: objectPath,
    Body: "<rss><data>hello Fred</data></rss>",
    ACL:'public-read'
}, function(err, data){
    if (err) console.log(err, err.stack); // an error occurred
    else {
        console.log(data);           // successful response
        s3.getObject({
            Bucket: process.env.AWS_S3_BUCKET, 
            Key: objectPath
        }, function(err, data){
            console.log(data.Body.toString());
        });
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.