Pesquisa de site

node.js - Como usar middleware express personalizado dentro do Nuxt.js


Estou construindo um aplicativo usando Nuxt.js. Uma das coisas que me atraiu especificamente no Nuxt foi a sua implementação de serverMiddleware.

O aplicativo é um livro de receitas para que eu possa automatizar o planejamento das refeições na minha casa :)

Eu configurei o aplicativo Nuxt com o seguinte middleware

nuxt.config.js

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

main.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

Quando eu executo nom run dev, vejo que o mongoose se conectou e o servidor funciona corretamente.

Além disso, eu configurei uma rota de teste

servidor/api/endpoints/v1/rotas.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

Agora é aqui que estou perdido...

Sou capaz de acessar a rota de teste sem nenhum problema; recebo o status 200 e também recebo a mensagem 'endpoint de teste'.

Quando tento postar dados no endpoint de receita, o console imprime que a requisição foi recebida na rota e está sendo passada para o seguinte 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;

mas a solicitação simplesmente fica pendurada e nunca é passada para o middleware personalizado...

O middleware está configurado incorretamente? O Nuxt não gosta de usar middleware adicional com o express? Por favor, ajude