// Import SDK, if the TOS Node.JS SDK version is less than 2.5.2, please change "TosClient" to "TOS" in the code below.
import { DataTransferType, createDefaultRateLimiter, TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';
import https from 'https';
const client = new TosClient({
accessKeyId: process.env['TOS_ACCESS_KEY'],
accessKeySecret: process.env['TOS_SECRET_KEY'],
region: "Provide your region", // Fill in the region where the Bucket is located. For example, if it is in China North 2 (Beijing), fill in "Provide your region" as cn-beijing.
endpoint: "Provide your endpoint", // Enter the domain address.
const bucketName = 'node-sdk-test-bucket';
const objectName = 'append-example.txt';
const rateLimit1M = 1024 * 1024;
const appendResult = await client.appendObject({
body: Buffer.from('your append object value.'),
console.log('appendResult', appendResult);
// Additional upload of network stream
const req = https.get('https://www.volcengine.com/');
const res = await new Promise((resolve) => req.on('response', resolve));
await client.appendObject({
offset: appendResult.data.nextAppendOffset,
contentLength: +res.headers['content-length'],
// Set up a callback function to monitor the upload progress through custom means.
dataTransferStatusChange: (event) => {
if (event.type === DataTransferType.Started) {
console.log('Data Transfer Started');
} else if (event.type === DataTransferType.Rw) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Once Read:${event.rwOnceBytes},ConsumerBytes/TotalBytes: ${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Succeed) {
const percent = ((event.consumedBytes / event.totalBytes) * 100).toFixed(2);
console.log(`Data Transfer Succeed, ConsumerBytes/TotalBytes:${event.consumedBytes}/${event.totalBytes},${percent}%`);
} else if (event.type === DataTransferType.Failed) {
console.log('Data Transfer Failed');
// Limit the upload speed to 1M/s on the client side while uploading the object.
rateLimiter: createDefaultRateLimiter(rateLimit1M, rateLimit1M),
// The size of the query object.
const { data } = await client.headObject({
console.log('object size:', data['content-length']);
function handleError(error) {
if (error instanceof TosClientError) {
console.log('Client Err Msg:', error.message);
console.log('Client Err Stack:', error.stack);
} else if (error instanceof TosServerError) {
console.log('Request ID:', error.requestId);
console.log('Response Status Code:', error.statusCode);
console.log('Response Header:', error.headers);
console.log('Response Err Code:', error.code);
console.log('Response Err Msg:', error.message);
console.log('unexpected exception, message: ', error);