es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cadena de conexión no definida proveniente de una variable de entorno no expuesta en el navegador para MongoDB y NextJS (next-connect).

Estoy teniendo un problema con la cadena de conexión de mi mongodb en mi aplicación CRUD de Next.js en producción.
Seguí esta guía: https://www.mongodb.com/developer/how-to/nextjs-building-modern-applications/

Y leí sobre variables de entorno aquí: https://nextjs.org/docs/basic-features/environment-variables, lo cual me dio la idea de que debería poder almacenar de manera segura mi cadena de conexión como una variable de entorno sin exponerla al navegador, suponiendo que solo necesitaré usarla en el lado del servidor, ¿verdad?

Funciona perfectamente bien cuando ejecuto la aplicación localmente. Pero en producción (servicio de aplicaciones de Azure), la cadena de conexión aparece como indefinida al menos que la exponga al navegador agregando el prefijo “NEXT_PUBLIC” a la variable.

¿Es seguro exponer esta variable / Hay algo que deba hacer de manera diferente para que funcione sin exponerla / Existe otro enfoque que deba tomar en su totalidad?

Mi database.js:

import { MongoClient } from 'mongodb';
import nextConnect from 'next-connect';

const client = new MongoClient(process.env.DB_CONNECTION_STRING, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

async function database(req, res, next) {
  await client.connect();
  req.dbClient = client;
  req.db = client.db('Loggen');
  return next();
}

const middleware = nextConnect();

middleware.use(database);

export default middleware;
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No es seguro exponer tu cadena de conexión de MongoDB al navegador o al código del lado del cliente, incluso con el prefijo “NEXT_PUBLIC_”. Esto puede potencialmente exponer información sensible y comprometer la seguridad de tu base de datos.

    Para hacer que funcione sin exponer tu cadena de conexión, puedes intentar usar la opción serverRuntimeConfig en next.js. Esto te permite configurar variables que solo están disponibles en el servidor y no se exponen al cliente. Aquí tienes un ejemplo:

    1. Primero, crea un archivo llamado “config.js” en el directorio raíz de tu proyecto.
    2. En “config.js”, define tu cadena de conexión de MongoDB como una variable solo del lado del servidor:

    module.exports = {
    serverRuntimeConfig: {
    // Solo estará disponible en el lado del servidor
    DB_CONNECTION_STRING: process.env.DB_CONNECTION_STRING,
    },
    publicRuntimeConfig: {
    // Estará disponible tanto en el servidor como en el cliente
    },
    };

    1. En tu archivo “database.js”, importa el módulo “config” y usa la variable serverRuntimeConfig:

    “`import { MongoClient } from ‘mongodb’;
    import nextConnect from ‘next-connect’;
    import getConfig from ‘next/config’;

    const { serverRuntimeConfig } = getConfig();

    const client = new MongoClient(serverRuntimeConfig.DB_CONNECTION_STRING, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    });

    async function database(req, res, next) {
    await client.connect();
    req.dbClient = client;
    req.db = client.db(‘Loggen’);
    return next();
    }

    const middleware = nextConnect();

    middleware.use(database);

    export default middleware;“`

    De esta manera, tu cadena de conexión de MongoDB solo es accesible en el servidor y no se expone al cliente.

Comments are closed.