Files
directus/docs/reference/old-sdk.md
Bevis Halsey-Perry 0c54f5a9ef Introduce SnippetToggler and New SDK Reference (#19110)
* items semi complete

* updated items page to use snippet toggler and migrated endpoint docs to use it

* updated files page to use snippet toggler and migrated REST and GraphQL endpoint docs to it

* updated activity page to use snippet toggler and migrated REST and GraphQL endpoint doc to it

* updated collections page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* updated dashboards page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated extensions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated fields page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated flows page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated folders page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated notifications page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated operations page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated panels page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated permissions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated presets page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated relations page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated revisions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated roles page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Made headlines consistant with the rest of the doc pages

* Updated server page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated settings page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated shares page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated translations page to use snippet togglers and migrated REST endpoint docs to them

* Updated users page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated utilities page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated webhooks page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated authentication page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* Updated Global Parameters page to use snippet togglers where there are adjacent REST and GraphQL Examples

* Added SDK code snippets to items page and made generic variables consistant

* Added SDK code snippets to files  page and made generic variables consistant

* Few lang changes for files page

* Added SDK code snippets to activity page and made generic variables consistant

* Added SDK code snippets to collections page and made generic variables consistant

* Added SDK code snippets to dashboards page and made generic variables consistant

* removed query word from query parameter objects

* Added SDK code snippets to fields page and made generic variables consistant

* SnippetToggler border

* Used dynamic border color for snippettoggler heading

* Spacing top and bottom of snippet toggler in docs

* Removed extra HRs

* Remove manual TOC in query reference

* Small code styling change in items page

* Updated users page to use snippet togglers and migrated REST and GraphQL endpoint docs to them

* dashboards fixed up property names

* Small copy update on extensions page

* Updated keys in delete mult notifications REST

* Updated keys in operations

* Update keys in panel delete many

* Update keys in permissions

* Added quotes around generic example ID strings

* Added code formatting to final example in share public info

* Format files

* Refined sidebar

* Insert newline before ending template tags

* Fixed extra closing tags, causing an error, un users ref

* Text Formatting Users

* Put GQL related notes inside toggler

* Added SDK code snippets to flows page and made generic variables consistant

* Added SDK code snippets to folder page and made generic variables consistant

* fixing whitepsace for flows and folders page

* Consistent newlines in SnippetToggler usages

* Run prettier

* Fix 'alwaysDark' definition

* Home page snippet toggler style fixes

* Fix snippet toggler lang hover color in light mode

* Introduce different code theme for light mode

* Added SDK code snippets to notifications page and made generic variables consistant

* Switch to 'material-theme-lighter'

* Format file

* Fix tip

* Fix tip in sdk ref

* Consistent spacing for custom containers

* Added SDK code snippets to operations page and made generic variables consistant

* Lint & format code blocks

* Lint & format operations

* Added SDK code snippets to panels page and made generic variables consistant

* Added SDK code snippets to permissions page and made generic variables consistant

* Added SDK code snippets to presets page and made generic variables consistant

* Added SDK code snippets to relations page and made generic variables consistant

* Added SDK code snippets to revisions page and made generic variables consistant

* Added SDK code snippets to roles page and made generic variables consistant

* Added SDK code snippets to server page and made generic variables consistant

* Added SDK code snippets to settings page and made generic variables consistant

* app_url -> directus_project_url

* Omitted auth details in delete multiple files

* Added quotes to values in roles

* Upload a file snippets

* Pluralization for upload/import files

* More files functions typos

* Added SDK code snippets to shares page (still missing createShare(s) as endpoint not functioning currently) and made generic variables consistant

* Added SDK code snippets to translations page (missing delete endponts because not working) and made generic variables consistant

* Added SDK code snippets to users page and made generic variables consistant

* Added SDK code snippets to webhooks page and made generic variables consistant

* Added SDK code snippets to utilites page (except cleaning cache, will be tested and added in later commit) and made generic variables consistant

* Added SDK code snippets to auth page (not login, refresh, and logout though due to errors)

* Added SDK code snippets for utilsExport and clearCache

* added github username be7DOTis to contributors

* Omit auth commands in updateComment

* utilsImport

* rename app_url generic value

* changed instances of updated*operation* to update*Operation*

* missed some 'updated' changse

* Added SDK Snippets to Query Parameters page

* Add section on file security

* added create(s)Shares SDK snippet to shares page

* added console.log to create snippets

* Added delete(s)Webhook SDK snippet to webhooks page

* Added SDK snippets to extensions page

* Added create/updateSingleton section to items page

* Links in files security

* Added SDK Snippets to Schema page

* Added GQL Generic examples to snippet togglers and removed snippet toggler from Login Using SSO Providers

* Added create(s)Presets SDK Snippets to presets page

* replaced fields query in generics snippets for a more generic

* replaced fields query in generics snippets for a more generic

* Use storage value only if valid choice

* Sync snippet togglers across page

* Update docs/reference/system/activity.md

* Update docs/reference/system/activity.md

* Update docs/reference/system/extensions.md

* Update docs/reference/system/revisions.md

* Update docs/reference/system/settings.md

* Update docs/reference/system/revisions.md

* Update docs/reference/system/settings.md

* Update docs/reference/system/activity.md

* Update docs/reference/system/roles.md

* Update docs/reference/system/roles.md

* Update docs/reference/system/roles.md

* Update docs/reference/system/roles.md

* Update docs/reference/system/schema.md

* Update docs/reference/system/server.md

* Update docs/reference/system/shares.md

* Replace all directus_project_url placeholders

* Revert "Sync snippet togglers across page"

This reverts commit 8b36f0d778.

* Update docs/reference/system/shares.md

* Update docs/reference/system/webhooks.md

* Clarify singleton section

* Consistent newlines between SnippetToggler templates

* Format files

* Remove console.log(result) statements from snippet

* Add examples for shares & users

Co-authored-by: Brainslug <tim@brainslug.nl>

* Fix hash GraphQL example

* Clarify update singleton section

* Add auth examples

Co-authored-by: Brainslug <tim@brainslug.nl>

* Final run on consistent newlines between SnippetToggler

* Switch to github themes

* The "Last One"

Co-authored-by: Brainslug <tim@brainslug.nl>

* The "Big One"

* Fix dead links

---------

Co-authored-by: Bevis Halsey-Perry <hi@be7.is>
Co-authored-by: Kevin Lewis <kvn@lws.io>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
Co-authored-by: Brainslug <tim@brainslug.nl>
2023-07-25 17:30:37 -04:00

24 KiB

description, readTime
description readTime
The JS SDK provides an intuitive interface for the Directus API from within a JavaScript-powered project (browsers and Node.js). The default implementation uses [Axios](https://npmjs.com/axios) for transport and `localStorage` for storing state. 14 min read

JavaScript SDK (pre v11)

The JS SDK provides an intuitive interface for the Directus API from within a JavaScript-powered project (browsers and Node.js). The default implementation uses Axios for transport and localStorage for storing state. Advanced customizations are available.

::: danger This SDK is no longer supported!

Version 11 introduced a complete rewrite of our SDK and the version referenced on this page is no longer supported either in terms of code or help in our community spaces. This page is purely for reference. New SDK docs can be found here.

:::

Installation

npm install @directus/sdk@10

Basic Usage

This is the starting point to use the JS SDK. After you've created the Directus instance, you can start invoking methods from it to access your project and data.

import { Directus } from '@directus/sdk';

const directus = new Directus('http://directus.example.com');

You can always access data available to the public role.

async function publicData() {
	// GET DATA

	// We don't need to authenticate if the public role has access to some_public_collection.
	const publicData = await directus.items('some_public_collection').readByQuery({ sort: ['id'] });

	console.log(publicData.data);
}

Basic Authentication

To access anything that is not available to the public role, you must be authenticated.

async function start() {
	// AUTHENTICATION

	let authenticated = false;

	// Try to authenticate with token if exists
	await directus.auth
		.refresh()
		.then(() => {
			authenticated = true;
		})
		.catch(() => {});

	// Let's login in case we don't have token or it is invalid / expired
	while (!authenticated) {
		const email = window.prompt('Email:');
		const password = window.prompt('Password:');

		await directus.auth
			.login({ email, password })
			.then(() => {
				authenticated = true;
			})
			.catch(() => {
				window.alert('Invalid credentials');
			});
	}

	// GET DATA

	// After authentication, we can fetch data from any collections that the user has permissions to.
	const privateData = await directus.items('some_private_collection').readByQuery({ sort: ['id'] });

	console.log(privateData.data);
}

start();

Custom Configuration

The previous section covered basic installation and usage of the JS SDK with default configurations for init. But sometimes you may need to customize these defaults.

Constructor

import { Directus } from '@directus/sdk';

const directus = new Directus(url, init);

Parameters


url required

  • TypeString
  • Description — A string that points to your Directus instance. E.g., https://example.directus.io
  • Default — N/A

init optional

  • TypeObject
  • Description — Defines authentication, storage and transport settings.
  • Default — The following shows the default values for init.
// This is the default init object
const config = {
	auth: {
		mode: 'cookie', // 'json' in Node.js
		autoRefresh: true,
		msRefreshBeforeExpires: 30000,
		staticToken: '',
	},
	storage: {
		prefix: '',
		mode: 'LocalStorage', // 'MemoryStorage' in Node.js
	},
	transport: {
		params: {},
		headers: {},
		onUploadProgress: (ProgressEvent) => {},
		maxBodyLength: null,
		maxContentLength: null,
	},
};

Customize auth

Defines how authentication is handled by the SDK. By default, Directus creates an instance of auth which handles refresh tokens automatically.

const auth = {
	mode: 'cookie', // 'json' in Node.js
	autoRefresh: true,
	msRefreshBeforeExpires: 30000,
	staticToken: '',
};

Options


mode

  • TypeString
  • Description — Defines the mode you want to use for authentication. It can be 'cookie' for cookies or 'json' for JWT.
  • Default — Defaults to 'cookie' on browsers and 'json' otherwise.

::: tip

We recommend using cookies when possible to prevent any kind of attacks, mostly XSS.

:::

autoRefresh

  • TypeBoolean
  • Description — Determines whether SDK handles refresh tokens automatically.
  • Default — Defaults to true.

msRefreshBeforeExpires

  • TypeNumber
  • Description — When autoRefresh is enabled, this tells how many milliseconds before the refresh token expires and needs to be refreshed.
  • Default — Defaults to 30000.

staticToken

  • TypeString
  • Description - Defines the static token to use. It is not compatible with the options above since it does not refresh.
  • Default — Defaults to '' (no static token).

Extend auth

It is possible to provide a custom implementation by extending IAuth. While this could be useful in certain advanced situations, it is not needed for most use-cases.

import { IAuth, Directus } from '@directus/sdk';

class MyAuth extends IAuth {
	async login() {
		return { access_token: '', expires: 0 };
	}

	async logout() {}
	async refresh() {
		return { access_token: '', expires: 0 };
	}

	async static() {
		return true;
	}
}

const directus = new Directus('https://example.directus.app', {
	auth: new MyAuth(),
});

Customize storage

The storage is used to load and save token information. By default, Directus creates an instance of storage which handles store information automatically.

const storage = {
	prefix: '',
	mode: 'LocalStorage', // 'MemoryStorage' in Node.js
};

::: tip Multiple Instances

If you want to use multiple instances of the SDK you should set a different prefix for each one.

:::

::: tip

The axios instance can be used for custom requests by calling:

await directus.transport<method>('/path/to/endpoint', {
	/* body, params, ... */
});

:::

Options


prefix

  • TypeString
  • Description — Defines the tokens prefix tokens that are saved. This should be fulfilled with different values when using multiple instances of SDK.
  • Default — Defaults to '' (no prefix).

mode

  • TypeString
  • Description — Defines the storage location to be used to save tokens. Allowed values are LocalStorage and MemoryStorage. The mode LocalStorage is not compatible with Node.js. MemoryStorage is not persistent, so once you leave the tab or quit the process, you will need to authenticate again.
  • Default — Defaults to LocalStorage on browsers and MemoryStorage on Node.js.

Extend storage

It is possible to provide a custom implementation by extending BaseStorage. While this could be useful in certain advanced situations, it is not needed for most use-cases.

import { BaseStorage, Directus } from '@directus/sdk';

class SessionStorage extends BaseStorage {
	get(key) {
		return sessionStorage.getItem(key);
	}

	set(key, value) {
		return sessionStorage.setItem(key, value);
	}

	delete(key) {
		return sessionStorage.removeItem(key);
	}
}

const directus = new Directus('https://example.directus.app', {
	storage: new SessionStorage(),
});

Customize transport

Defines settings you want to customize regarding Transport.

By default, Directus creates an instance of Transport which handles requests automatically. It uses axios so it is compatible in both browsers and Node.js. With axios, it is also possible to handle upload progress (a downside of fetch).

The configurations within init.transport are passed to axios. For more details, see Request Config in the axios documentation.

export default {
	params: {},
	headers: {},
	onUploadProgress: (ProgressEvent) => {},
	maxBodyLength: null,
	maxContentLength: null,
};

Options


params

  • TypeObject
  • Description — Defines an object with keys and values to be passed as additional query string.
  • Default — N/A

headers

  • TypeObject
  • Description - Defines an object with keys and values to be passed as additional headers.
  • Default — N/A

onUploadProgress

  • TypeFunction
  • Description — Defines a callback function to indicate the upload progress.
  • Default — N/A

::: tip ProgressEvent

Please see the MDN documentation to learn more about the ProgressEvent.

:::


maxBodyLength

  • TypeNumber
  • Description — The maximum body length in bytes. Set Infinity for no limit.
  • Default — N/A

maxContentLength

  • TypeNumber
  • Description — The maximum content length in bytes. Set Infinity for no limit.
  • Default — N/A

Extend Transport

It is possible to provide a custom implementation by extending ITransport. For example, you can customize it to use different HTTP libraries. While this could be useful in certain advanced situations, it is not needed for most use-cases.

import { ITransport, Directus } from '@directus/sdk';

class MyTransport extends ITransport {
	buildResponse() {
		return {
			raw: '',
			data: {},
			status: 0,
			headers: {},
		};
	}

	async get(path, options) {
		return this.buildResponse();
	}

	async head(path, options) {
		return this.buildResponse();
	}

	async options(path, options) {
		return this.buildResponse();
	}

	async delete(path, data, options) {
		return this.buildResponse();
	}

	async post(path, data, options) {
		return this.buildResponse();
	}

	async put(path, data, options) {
		return this.buildResponse();
	}

	async patch(path, data, options) {
		return this.buildResponse();
	}
}

const directus = new Directus('https://example.directus.app', {
	transport: new MyTransport(),
});

TypeScript

Version >= 4.1

Although it's not required, it is recommended to use TypeScript to have an easy development experience. This allows more detailed IDE suggestions for return types, sorting, filtering, etc.

To feed the SDK with your current schema, you need to pass it on the constructor.

type BlogPost = {
	id: ID;
	title: string;
};

type BlogSettings = {
	display_promotions: boolean;
};

type MyCollections = {
	posts: BlogPost;
	settings: BlogSettings;
};

// This is how you feed custom type information to Directus.
const directus = new Directus<MyCollections>('https://example.directus.app');

// ...

const post = await directus.items('posts').readOne(1);
// typeof(post) is a partial BlogPost object

const settings = await posts.singleton('settings').read();
// typeof(settings) is a partial BlogSettings object

You can also extend the Directus system type information by providing type information for system collections as well.

import { Directus } from '@directus/sdk';

// Custom fields added to Directus user collection.
type UserType = {
	level: number;
	experience: number;
};

type CustomTypes = {
	/*
	This type will be merged with Directus user type.
	It's important that the naming matches a directus
	collection name exactly. Typos won't get caught here
	since SDK will assume it's a custom user collection.
	*/
	directus_users: UserType;
};

const directus = new Directus<CustomTypes>('https://example.directus.app');

await directus.auth.login({
	email: 'admin@example.com',
	password: 'password',
});

const me = await directus.users.me.read();
// typeof me = partial DirectusUser & UserType;

// OK
me.level = 42;

// Error TS2322: Type "string" is not assignable to type "number".
me.experience = 'high';

Authentication

Get current token

await directus.auth.token;

::: warning Async

Reading the token is an asynchronous getter. This makes sure that any currently active refresh calls are being awaited before the current token is returned.

:::

Login

With credentials

await directus.auth.login({
	email: 'admin@example.com',
	password: 'd1r3ctu5',
});

With static tokens

await directus.auth.static('static_token');

Refresh Auth Token

By default, Directus will handle token refreshes. Although, you can handle this behavior manually by setting autoRefresh to false.

await directus.auth.refresh();

::: tip Developing Locally

If you're developing locally, you might not be able to refresh your auth token automatically in all browsers. This is because the default auth configuration requires secure cookies to be set, and not all browsers allow this for localhost. You can use a browser which does support this such as Firefox, or disable secure cookies.

:::

Logout

await directus.auth.logout();

Request a Password Reset

By default, the address defined in PUBLIC_URL on .env file is used for the link to the reset password page sent in the email:

await directus.auth.password.request('admin@example.com');

But a custom address can be passed as second argument:

await directus.auth.password.request(
	'admin@example.com',
	'https://myapp.com' // In this case, the link will be https://myapp.com?token=FEE0A...
);

Note: To use a custom address you need to configure the PASSWORD_RESET_URL_ALLOW_LIST environment variable to enable this feature.

Reset a Password

await directus.auth.password.reset('abc.def.ghi', 'n3w-p455w0rd');

Note: The token passed in the first parameter is sent in an email to the user when using request()

Items

You can get an instance of the item handler by providing the collection (and type, in the case of TypeScript) to the items function. The following examples will use the Article type.

JavaScript

// import { Directus, ID } from '@directus/sdk';
const { Directus } = require('@directus/sdk');

const directus = new Directus('https://example.directus.app');

const articles = directus.items('articles');

TypeScript

import { Directus, ID } from '@directus/sdk';

// Map your collection structure based on its fields.
type Article = {
	id: ID;
	title: string;
	body: string;
	published: boolean;
};

// Map your collections to its respective types. The SDK will
// infer its types based on usage later.
type MyBlog = {
	// [collection_name]: typescript_type
	articles: Article;

	// You can also extend Directus collection. The naming has
	// to match a Directus system collection and it will be merged
	// into the system spec.
	directus_users: {
		bio: string;
	};
};

// Let the SDK know about your collection types.
const directus = new Directus<MyBlog>('https://example.directus.app');

// typeof(article) is a partial "Article"
await directus.items('articles').readOne(10);

// Error TS2322: "hello" is not assignable to type "boolean".
// post.published = 'hello';

Create Single Item

await articles.createOne({
	title: 'My New Article',
});

Create Multiple Items

await articles.createMany([
	{
		title: 'My First Article',
	},
	{
		title: 'My Second Article',
	},
]);

Read By Query

await articles.readByQuery({
	search: 'Directus',
	filter: {
		date_published: {
			_gte: '$NOW',
		},
	},
});

Read All

await articles.readByQuery({
	// By default API limits results to 100.
	// With -1, it will return all results, but it may lead to performance degradation
	// for large result sets.
	limit: -1,
});

Read Single Item

await articles.readOne(15);

Supports optional query:

await articles.readOne(15, {
	fields: ['title'],
});

Read Multiple Items

await articles.readMany([15, 16, 17]);

Supports optional query:

await articles.readMany([15, 16, 17], {
	fields: ['title'],
});

Update Single Item

await articles.updateOne(15, {
	title: 'This articles now has a different title',
});

Supports optional query:

await articles.updateOne(
	42,
	{
		title: 'This articles now has a similar title',
	},
	{
		fields: ['title'],
	}
);

Update Multiple Items

await articles.updateMany([15, 42], {
	title: 'Both articles now have the same title',
});

Supports optional query:

await articles.updateMany(
	[15, 42],
	{
		title: 'Both articles now have the same title',
	},
	{
		fields: ['title'],
	}
);

Delete

// One
await articles.deleteOne(15);

// Multiple
await articles.deleteMany([15, 42]);

Request Parameter Overrides

To override any of the axios request parameters, provide an additional parameter with a requestOptions object:

await articles.createOne(
	{ title: 'example' },
	{ fields: ['id'] },
	{
		requestOptions: {
			headers: {
				'X-My-Custom-Header': 'example',
			},
		},
	}
);

Activity

directus.activity;

The activity property has all the methods of directus.items('directus_activity') with the addition of an alias to the activity comments (below).

directus.activity.comments;

Comments

directus.comments;

Create a comment

await directus.comments.create({
	// ...
});

Update a comment

await directus.comments.update(/* comment activity id */ 15, 'Yo, dawg!');

Delete a comment

await directus.comments.delete(/* comment activity id */ 15);

Collections

directus.collections;

Read a single collection

await directus.collections.readOne(/* collection name */ 'articles');

Read all collections

await directus.collections.readAll(); // Doesn't currently support query or searching

Create a collection

await directus.collections.createOne({ collection: 'articles', /* ... */ });

Create multiple collections

await directus.collections.createMany([{ collection: 'articles', /* ... */ }, /* ... */]);

Update a collection

await directus.collections.updateOne(/* collection name */ 'articles', /* patch */ { note: 'All the articles' }, query);

Delete a collection

await directus.collections.deleteOne(/* collection name */ 'articles');

Fields

directus.fields;

Read a single field

await directus.fields.readOne(/* collection name */ 'articles', /* id of the field */ 15);

Read multiple fields

await directus.fields.readMany(/* collection name */ 'articles'); // Doesn't currently support query parameter

Read all fields

await directus.fields.readAll(); // Doesn't currently support query or searching

Create a field

await directus.fields.createOne(/* collection name */ 'articles', { field: 'alt_title', /* ... */ });

Update a field

await directus.fields.updateOne(
	/* collection name */ 'articles',
	/* field_name */ 'alt_title',
	/* patch */ { hidden: true }
);

Delete a field

await directus.fields.deleteOne(/* collection name */ 'articles', /* field_name */ 'alt_title');

Files

directus.files;

The files property support all of the functions common to all items - directus.items('directus_files') with one addition: import.

Import

In addition to the items common methods, the files property adds the import method for importing files.

directus.files.import(/* ... */);

See API File Import

Uploading a file

To upload a file you will need to send a multipart/form-data as body. On browser side you do so:

/* index.js */
import { Directus } from 'https://unpkg.com/@directus/sdk@latest/dist/sdk.esm.min.js';

const directus = new Directus('https://example.directus.app', {
	auth: {
		staticToken: 'STATIC_TOKEN', // If you want to use a static token, otherwise check below how you can use email and password.
	},
});

// await directus.auth.login({ email, password })
// If you want to use email and password, remove the staticToken above.

const form = document.querySelector('#upload-file');

if (form && form instanceof HTMLFormElement) {
	form.addEventListener('submit', async (event) => {
		event.preventDefault();

		const form = new FormData(event.target);
		await directus.files.createOne(form);
	});
}
<!-- index.html -->
<html>
	<head></head>
	<body>
		<form id="upload-file">
			<input type="text" name="title" />
			<input type="file" name="file" />
			<button>Send</button>
		</form>
		<script src="/index.js" type="module"></script>
	</body>
</html>

NodeJS usage

When uploading a file from a NodeJS environment, you'll have to override the headers to ensure the correct boundary is set:

import { Directus } from 'https://unpkg.com/@directus/sdk@latest/dist/sdk.esm.min.js';

const directus = new Directus('https://example.directus.app', {
	auth: {
		staticToken: 'STATIC_TOKEN', // If you want to use a static token, otherwise check below how you can use email and password.
	},
});

const form = new FormData();
form.append('file', fs.createReadStream('./to_upload.jpeg'));

await directus.files.createOne(
	form,
	{},
	{
		requestOptions: {
			headers: {
				...form.getHeaders(),
			},
		},
	}
);

Importing a file

Example of importing a file from a URL:

await directus.files.import({
	url: 'http://www.example.com/example-image.jpg',
});

Example of importing file with custom data:

await directus.files.import({
	url: 'http://www.example.com/example-image.jpg',
	data: {
		title: 'My Custom File',
	},
});

Folders

directus.folders;

Same methods as directus.items("directus_folders").

Permissions

directus.permissions;

Same methods as directus.items("directus_permissions").

Presets

directus.presets;

Same methods as directus.items("directus_presets").

Relations

directus.relations;

Same methods as directus.items("directus_relations").

Revisions

directus.revisions;

Same methods as directus.items("directus_revisions").

Roles

directus.roles;

Same methods as directus.items("directus_roles").

Settings

directus.settings;

Same methods as directus.items("directus_settings").

Server

Ping the Server

await directus.server.ping();

Get Server/Project Info

await directus.server.info();

Users

directus.users;

Same methods as directus.items("directus_users"), and:

Invite a New User

await directus.users.invites.send('admin@example.com', 'fe38136e-52f7-4622-8498-112b8a32a1e2');

The second parameter is the role of the user

Accept a User Invite

await directus.users.invites.accept('<accept-token>', 'n3w-p455w0rd');

The provided token is sent to the user's email

Enable Two-Factor Authentication

await directus.users.tfa.enable('my-password');

Disable Two-Factor Authentication

await directus.users.tfa.disable('691402');

Get the Current User

await directus.users.me.read();

Supports optional query:

await directus.users.me.read({
	fields: ['last_access'],
});

Update the Current Users

await directus.users.me.update({ first_name: 'Admin' });

Supports optional query:

await directus.users.me.update({ first_name: 'Admin' }, { fields: ['last_access'] });

Utils

Get a Random String

await directus.utils.random.string();

Supports an optional length (defaults to 32):

await directus.utils.random.string(50);

Generate a Hash for a Given Value

await directus.utils.hash.generate('My String');

Verify if a Hash is Valid

await directus.utils.hash.verify('My String', '$argon2i$v=19$m=4096,t=3,p=1$A5uogJh');

Sort Items in a Collection

await directus.utils.sort('articles', 15, 42);

This will move item 15 to the position of item 42, and move everything in between one "slot" up.

Revert to a Previous Revision

await directus.utils.revert(451);

Note: The key passed is the primary key of the revision you'd like to apply.