Un connecteur MongoDB Atlas basé sur HTTP pour les environnements d’exécution sans serveur (par exemple, Cloudflare Workers et Deno Deploy) utilisant l’API Fetch native
- mongo-http.js peut être utilisé lorsque le client ne prend pas en charge la connexion TCP brute mais prend en charge la connexion HTTP, par exemple, certains runtimes sans serveur ou Cloudflare Workers
- Il peut également être utilisé dans des environnements d’exécution sans serveur où la réutilisation d’une connexion MongoDB peut ne pas toujours être disponible ou alors nécessite une mise en cache manuelle
- Malheureusement, il ne peut pas encore être utilisé du côté du navigateur, en raison de SCRO. Voici une fil pour demander la fonctionnalité CORS
Il y a quelques mois, j’ai migré Moyen rare (un grattoir et chercheur d’articles chinois sur Medium) de Heroku à Cloudflare Workers. j’ai utilisé le API de données MongoDB pour remplacer le Pilote MongoDB Node.js. Pendant le voyage, j’ai eu l’impression d’effectuer à plusieurs reprises des appels de récupération à l’API de données, et l’API familière du pilote Node.js me manque. Par conséquent, j’ai construit ce mince wrapper au-dessus de l’API de données, que je (et j’espère que d’autres) pourront utiliser dans de futurs projets sans serveur !
Configurez MongoDB Atlas pour obtenir l’ID de l’application et la clé API
Avant d’utiliser mongo-http.js (MongoDB Data API), vous devez obtenir l’ID de l’application et la clé API. Voir plus de détails dans le Tutoriel MongoDB Atlas.
Installation
npm install mongo-http — save
Initialisation
Vous pouvez choisir d’initialiser un client
une database
ou un collection
comme indiqué ci-dessous. Habituellement, nous voudrions initialiser un database
lien.
Vous pouvez également initialiser un client pour qu’il se connecte à plusieurs bases de données.
import { initClient } from 'mongo-http';
const client = initClient({
appId: process.env.appId,
apiKey: process.env.apiKey,
});
const db = client.database({ databaseName: process.env.databaseName });
const result = await db.collection('articles').find({
filter: {
$or: [{ categories: { $in: ['javascript', 'reactjs', 'nodejs', 'mongodb'] } }],
},
});
Comment initialiser une base de données
import { initDatabase } from 'mongo-http';
const db = initDatabase({
appId: process.env.appId || '',
apiKey: process.env.apiKey || '',
databaseName: process.env.databaseName || '',
});
const result = await db.collection('articles').find({});
Comment initialiser une collection
import { initDatabase } from 'mongo-http';
const articlesCollection = initCollection({
appId: process.env.appId || '',
apiKey: process.env.apiKey || '',
databaseName: process.env.databaseName || '',
collectionName: 'articles',
});
const result = await articlesCollection.find({});
Cela reflète comment le pilote MongoDB Node.js initialise ces trois instances.
const { MongoClient } = require("mongodb");
const client = new MongoClient(process.env.uri);
await client.connect();const db = client.db("<your database>");
const collection = db.collection("<your collection>");
const document = await collection.findOne({});
Vous pouvez trouver le GitHub README.md
Documentation API ici. Les paramètres d’entrée reflètent l’API de données mais adoptent des API similaires du pilote Node.js.
Dans ce qui suit, voyons comment créer (insertOne
), lire (find
), mettre à jour (updateOne
) et supprimer (deleteOne
) un document. Supposons que nous ayons deux collections — articles
et writers
et le document ressemble à ceci :
const article = {
_id: 'article-1-object-id',
writerId: 'patrick-writer-object-id',
title: 'Migrating a Node.js App to Cloudflare Workers From Heroku',
tags: ['javascript', 'cloudflare-workers', 'heroku', 'nodejs']
}const writer = {
_id: 'patrick-writer-object-id',
name: 'Patrick Chiu',
latestArticlesAt: '2023-01-01T12:15:00.000Z'
}
1. insertOne
Supposons que nous ayons récupéré un article et que nous souhaitions insérer le document dans articles
.
const result = await db.collection('articles').insertOne({
writerId: 'patrick-writer-object-id',
title: 'Introducing mongo-http.js',
tags: ['javascript', 'mongodb', 'serverless', 'nodejs', 'cloudflare-workers']
});// If the insertion is successful
// => isSuccess: true, insertedId: 'object-id'
const { isSuccess, insertedId } = result;
2. trouver
Ensuite, nous développons un point final /articles
qui aide les utilisateurs à rechercher par tags
. Ici, j’utilise hono.js en tant que cadre Web.
import { Hono } from 'hono';
const app = new Hono();// For illustration purpose,
// I skip a lot of details, such as error handling
app.get('/v1/articles', async (c) => {
const { tags = '' } = c.req.query();
if (tags === '') {
return c.json({ articles: [] });
}
const tagArray = tags
.split(',')
.slice(0, 10)
.map((tag) => tag.trim());
const result = db.collection('articles').find({
filter: { tags: { $in: tagArray } }
});
const { isSuccess, documents } = result;
return c.json({ articles: documents || [] });
});
3. mise à jour
Outre la suppression d’articles, nous souhaitons également mettre à jour le latestArticlesAt
d’un utilisateur.
const result = db.collection('writers').updateOne({
filter: { writerId: 'patrick-writer-object-id' },
update: {
latestArticlesAt: '2023-01-04T19:30:00.000Z'
},
});// If the update is successful
// => isSuccess: true, matchedCount: 1, modifiedCount: 1
// Since it is an existing document, upsertedId will be nil
const { isSuccess, matchedCount, modifiedCount, upsertedId } = result;
4. supprimerUn
Si l’utilisateur supprime son compte Medium, nous voulons supprimer le document de l’utilisateur.
const result = await db.collection('writers').deleteOne({
filter: { writerId: 'non-existing-writer-object-id' },
});// If the delete is successful
// => isSuccess: true, deletedCount: 1
const { isSuccess, deletedCount } = result;
Dans de futurs articles, j’espère montrer des exemples complets d’utilisation de mongo-http avec différents frameworks Web (par exemple, hono.js et tout à fait) dans différents environnements d’exécution sans serveur (par exemple, Travailleurs Cloudflare, Fonctions Digital Oceanet Deno Deploy)