I just created a serverless function on my a Appwrite project, pointing at a source repository (no templates).
I am authenticated as the owner of the project. Trying to run the function from Appwrite Cloud Console UI and getting this error:
Error: app.64f85c5ce3ecabddd466@service.cloud.appwrite.io (role: applications) missing scope (collections.read)
at Client.call (/usr/local/server/src/function/node_modules/node-appwrite/lib/client.js:172:31)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Databases.getCollection (/usr/local/server/src/function/node_modules/node-appwrite/lib/services/databases.js:267:16)
at async createMigrationCollection (file:///usr/local/server/src/function/node_modules/@franciscokloganb/appwrite-database-migration-tool/dist/lib.esm.js:599:22)
at async Module.default (file:///usr/local/server/src/function/functions/database/migrations-create-collection.js:4:3)
at async execute (/usr/local/server/src/server.js:141:22)
at async /usr/local/server/src/server.js:158:13
The function tries to create a collection. How do I add the missing scope to anyone who belongs to the project?
Note: I have global appwrite variables set on the project and the function picks them up correctly. Isn't Appwrite Server SDK supposed to be able to do everything everywhere, why is it missing scopes?
import { Client, Databases } from 'node-appwrite';
import invariant from 'tiny-invariant';
import { MIGRATIONS_COLLECTION_ID, MIGRATIONS_COLLECTION_NAME } from './constants';
import type { Logger } from './types';
function configuration() {
// The function in the repository executes invariant, ensuring all envs are defined.
// I am also seeing the correct values in the logs.
const apiKey = process.env['APPWRITE_API_KEY'];
const collectionId = process.env['MIGRATIONS_COLLECTION_ID'];
const collectionName = process.env['MIGRATIONS_COLLECTION_NAME'];
const databaseId = process.env['MIGRATIONS_DATABASE_ID'];
const endpoint = process.env['APPWRITE_ENDPOINT'];
const projectId = process.env['APPWRITE_FUNCTION_PROJECT_ID'];
return {
apiKey,
collectionId,
collectionName,
databaseId,
endpoint,
projectId,
};
}
export async function createMigrationCollection({ log, error }: { log: Logger; error: Logger }) {
log('Create migration collection started.');
const { endpoint, apiKey, databaseId, collectionId, collectionName, projectId } = configuration();
log(`Initiating client. Endpoint: ${endpoint}, ProjectID: ${projectId}`);
const client = new Client().setEndpoint(endpoint).setProject(projectId).setKey(apiKey);
const databaseService = new Databases(client);
const collection = await databaseService.getCollection(databaseId, collectionId);
if (collection) {
log('Create migration collection exited. Collection already exists.');
return;
}
await databaseService
.createCollection(databaseId, collectionId, collectionName)
.then(() => log('Create migration collection completed successfully.'))
.catch((e) => {
error(`Could not create collection ${collectionName} (id: ${collectionId}).`);
if (e instanceof Error) {
error(e.message);
}
});
}
Have you added the collections.read scope to your API key?
Indeed. 🥹 I did not.
I just noticed I had a few - signs on my Scopes
I will try rerunning.
✅
Can I mark this as solved?
Yes, thanks
[SOLVED] Functions: Unable to write to Collections
Recommended threads
- How does sending email from the Appwrite...
I noticed that the pricing page mentions “Messages – 1000 per month” for the Free plan. Is this different from sending emails? When I try to send an email usin...
- Appwrite functions dart runtime (3.7 sup...
It seems that currently Appwrite functions only support Dart runtime to 3.5, for my code I need dart 3.7. Is there any plan to support Dart3.7 runtime soon. Is ...
- Update string attribute
Hi, Unsure if we’re able to use newKey when updating string attribute over node.js server api call to change an attribute name instead of having to create a ne...