Skip to content

Functions

Examples_

Accelerate your serverless development with Appwrite Functions examples. Access a library of code samples and use cases to jumpstart your projects.

4 min read

Raw

Appwrite Functions is all about flexibility. Behind the simple workflow hides some useful examples that can help you accomplish your goals faster. Take a look at the following.

1. Currency conversion API

Here's a currency conversion API that converts from Euros and Indian Rupees to US Dollars. We'll use an external API to get the latest exchange rates and query it using a dependency specific to each runtime.

Prerequisites

Run the following bash command to create a package.json file. This file is used to manage your Node.js project's dependencies.

Bash
npm init -y

Install the undici library. This library includes a fetch function that you can use to make HTTP requests.

Bash
npm install undici

Finally, add npm install to your function's build commands in the Appwrite Console.

Code

import { fetch } from 'undici';
export default async function ({ req, res }) {
if (req.path === '/eur') {
const amountInEuros = Number(req.query.amount);
const response = await fetch('https://api.exchangerate.host/latest?base=EUR&symbols=USD');
const data = await response.json();
const amountInDollars = amountInEuros * data.rates.USD;
return res.text(amountInDollars.toString());
}
if (req.path === '/inr') {
const amountInRupees = Number(req.query.amount);
const response = await fetch('https://api.exchangerate.host/latest?base=INR&symbols=USD');
const data = await response.json();
const amountInDollars = amountInRupees * data.rates.USD;
return res.text(amountInDollars.toString());
}
return res.text('Invalid path');
};

2. Voting system

Here's a simple voting system that allows users to vote on various topics. Appwrite Functions and the server SDK are used to enforce voting rules and prevent multiple votes from the same user for a single topic.

Prerequisites

Create a Topics table with the following columns:

NameTypeDescription
titleVarcharThe name of the topic
descriptionTextLong form description of the topic

Create a Votes table with the following columns:

NameTypeDescription
userIdVarcharThe ID of the user who cast the vote
topicIdVarcharThe ID of the topic that was voted on
voteVarcharThe vote cast by the user. Must be either "yes" or "no"

Code

import { Client, TablesDB, Query, ID } from 'node-appwrite';
export default async function ({ req, res }) {
const vote = {
userId: req.query.userId,
topicId: req.query.topicId,
vote: req.query.vote
};
if (vote.vote !== 'yes' && vote.vote !== 'no') {
return res.json({ ok: false, message: 'You must vote yes or no.' }, 400);
}
// Set project and set API key
const client = new Client();
client
.setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
.setKey(req.headers['x-appwrite-key']);
const tablesDB = new TablesDB(client);
const existingVotes = await tablesDB.listRows({
databaseId: '<DATABASE_ID>',
tableId: '<VOTES_TABLE_ID>',
queries: [
Query.equal('userId', vote.userId),
Query.equal('topicId', vote.topicId)
]
});
if (existingVotes.total > 0) {
return res.json({ ok: false, message: 'You have already voted on this topic.' }, 400);
}
const voteDocument = await tablesDB.createRow({
databaseId: '<DATABASE_ID>',
tableId: '<VOTES_TABLE_ID>',
rowId: ID.unique(),
data: {
userId: vote.userId,
topicId: vote.topicId,
vote: vote.vote,
}
});
return res.json({ ok: true, message: 'Vote cast.', vote: voteDocument });
};

Use the function by navigating to the function URL in the browser. The URL should contain the required parameters. For example, <YOUR_FUNCTION_URL>/?userId=<USER_ID>&topicId=<TOPIC_ID>&vote=yes to cast a vote.

3. HTML contact form

Here's a simple form page that handles form submissions, and can be used to store a user's message in a table. The form is submitted to the function using the POST method and the form data is sent as a URL-encoded string in the request body.

Prerequisites

Create a Messages table with the following columns:

NameTypeDescription
nameVarcharThe name of the message author
emailEmailThe email of the message author
contentTextThe content of the message

Code

import { Client, TablesDB, Query, ID } from 'node-appwrite';
import querystring from 'node:querystring';
const html = `<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Contact Form</title>
</head>
<body>
<form action="/" method="POST">
<input type="text" id="name" name="name" placeholder="Name" required>
<input type="email" id="email" name="email" placeholder="Email" required>
<textarea id="content" name="content" placeholder="Message" required></textarea>
<button type="submit">Submit</button>
</form>
</body>
</html>`
export default async function ({ req, res }) {
if (req.method === 'GET') {
return res.text(html, 200, {'content-type': 'text/html'});
}
if (req.method === 'POST' && req.headers['content-type'] === 'application/x-www-form-urlencoded') {
const formData = querystring.parse(req.body);
const message = {
name: formData.name,
email: formData.email,
content: formData.content
};
// Set project and set API key
const client = new Client()
.setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
.setKey(req.headers['x-appwrite-key']);
const tablesDB = new TablesDB(client);
const row = await tablesDB.createRow({
databaseId: '<DATABASE_ID>',
tableId: '<MESSAGES_TABLE_ID>',
rowId: ID.unique(),
data: message
});
return res.text("Message sent");
}
return res.text('Not found', 404);
}

Use the function by navigating to the function URL in the browser. Submit the form to store the message in the table.

Was this page helpful?

Share what worked or what we should fix. Once approved, our agents automatically apply suggested updates to the docs.