Búsqueda de sitios web

node.js - Cómo usar middleware personalizado de Express dentro de Nuxt.js


Estoy construyendo una aplicación usando Nuxt.js. Una de las cosas que me atrajo específicamente de Nuxt fue su implementación de serverMiddleware.

La aplicación es un libro de cocina para que pueda automatizar la planificación de comidas en mi casa :)

Tengo la aplicación Nuxt configurada con el siguiente middleware

nuxt.config.js

serverMiddleware: [{ path: '/api', handler: '~server/main.ts' }],

principal.ts

import 'dotenv/config';
import express, {
    Request,
    Response,
    NextFunction
} from 'express';
import mongoose from 'mongoose';
import routesv1 from './api/endpoints/v1/routes';
import dayjs from 'dayjs';

const server = express();

const dbUri: string = `mongodb+srv://${process.env.mongoUser}:${process.env.mongoPassword}@dev.ivzgx.mongodb.net/dev`;

mongoose.connect(dbUri, { ssl: true, sslValidate: false})
    .then(() => {
        console.log(`[${dayjs()}] Connected to MongoDB`);
    }).catch(error => {
        console.warn(error);
    });
server.use(express.urlencoded({ extended: false }))
server.use((req: Request, res: Response, next: NextFunction) => {
    console.info(`[${req.method}] ${req.url} ${res.statusCode}`);
    next();
    });

server.use(express.json());
server.use('/v1', routesv1);

export default server

Cuando ejecuto nom run dev veo que mongoose se ha conectado y el servidor funciona correctamente.

Además, he configurado una ruta de prueba

servidor/api/endpoints/v1/rutas.ts

import express, {Request, Response, Express} from 'express';
import validateResource from '../../middleware/validateResource';
import { createRecipeSchema } from '../../schema/recipe.schema';
import { createRecipeHandler } from '../../controller/recipe.controller'

const router = express.Router();

router.get('/test', (req: Request, res: Response) => {
    res.send('test endpoint');
})

router.post('/recipe', async (req: Request, res: Response) => {
    console.log("router hit; passing to validation middleware")
    validateResource(createRecipeSchema),
    createRecipeHandler
})

export default router

Ahora es aquí donde estoy perdido...

Puedo acceder a la ruta de prueba sin ningún problema; recibo el estado 200 y recibo el mensaje 'punto final de prueba'.

Cuando intento enviar datos al endpoint de recetas, la consola muestra que la solicitud fue recibida en la ruta y se está pasando al siguiente middleware

servidor/api/middleware/validarRecurso.ts

import { Request, Response, NextFunction } from "express";
import { AnyZodObject } from "zod";

const validate = 
    (schema: AnyZodObject) => 
    (req: Request, res: Response, next: NextFunction) => {
        try {
            console.log('attempting to parse schema')

            schema.parse({
                body: req.body,
                query: req.query,
                params: req.params
            });
            next();
        } catch (e: any) {
            return res.status(400).send(e.errors);
        }
    };

export default validate;

pero la solicitud simplemente se queda colgada y nunca se pasa al middleware personalizado...

¿Está configurado incorrectamente el middleware? ¿A Nuxt no le gusta usar middleware adicional con Express? Por favor, ayuda.