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