Estoy construyendo una API con NextJS y MongoDB. Hago una configuración básica en la parte superior del archivo API:
const { db } = await connectToDatabase(); const scheduled = db.collection('scheduled');y continúo el código con mi función de controlador:
export default async function handler(req, res) { otherFunctionCalls() ... } const otherFunctionCalls = async () => { ... } Sé que await funcionará solo dentro de una función asíncrona, pero me gustaría usar la constante scheduled en otras funciones a las que llama el controlador, por eso necesito llamarlo en la parte superior.
Si pongo la constante a cada función, entonces es una duplicación de código.
¿Cuál es la mejor práctica para acceder a la constante scheduled ? ¿Debo agregar la declaración otherFunctionCalls en la función del controlador?
El error completo lo que obtuve:
Module parse failed: The top-level-await experiment is not enabled (set experiments.topLevelAwait: true to enabled it) File was processed with these loaders: * ./node_modules/next/dist/build/babel/loader/index.js You may need an additional loader to handle the result of these loaders. Error: The top-level-await experiment is not enabled (set experiments.topLevelAwait: true to enabled it)En los comentarios, dijo que desea encontrar otra solución en lugar de habilitar el experimento de await de nivel superior en la herramienta que está utilizando.
Para hacer eso, tendrá que ajustar el código del módulo para manejar el hecho de que aún no tiene la colección scheduled , solo tiene una promesa . Si la única función exportada es handler y todas las demás funciones se van a llamar desde handler , tiene sentido manejar eso (¡sin juego de palabras!) en handler , de la siguiente manera:
// A promise for the `scheduled` collection const pScheduled = connectToDatabase().then(db => db.collection("scheduled")); export default async function handler(req, res) { const scheduled = await pScheduled; await otherFunctionCalls(scheduled); // ... } const otherFunctionCalls = async (scheduled) => { // ...use `scheduled` here... }; Hay muchas maneras en que puede modificar eso, pero fundamentalmente querrá obtener la promesa (solo una vez está bien) y await a que obtenga su valor de cumplimiento en cualquier lugar donde necesite su valor de cumplimiento. (Para evitar el doble: await no vuelve a ejecutar nada; si la promesa ya se cumplió, solo le devuelve el valor de cumplimiento que ya tiene la promesa).