Me gustaría establecer callbackWaitsForEmptyEventLoop en false en mi controlador Nextjs, pero a su firma le falta el contexto.
El objetivo es configurar correctamente nextjs, mongoDB, mongoose para evitar cualquier problema de rendimiento cuando se implementa en aws-lambda. He estado buscando y parece que la mayoría de los ejemplos de opciones están desactualizados y no se aplican a mongoose 6. Dado que la conexión se realiza dentro de aws-lambda y se almacena en caché, ¿sigue siendo necesario cerrar las conexiones manualmente?
Configuración actual basada en varias recomendaciones:
// useDb options export const useDbOptions = { useCache: true, noListener: true, }; // Schema options export const useSchemaOptions = { autoIndex: true, bufferCommands: false, }; // Cached connection outside of handler let conn: Promise<typeof mongoose> | null = null; // Mongoose options mongoose.connect(mongoDbUri, { bufferCommands: false, }) A la firma del controlador de Nextjs le falta el context :
async function handler(req: NextApiRequest, res: NextApiResponse) { ... }Por recomendaciones de mongoose doc:
const mongoose = require('mongoose'); let conn = null; const uri = 'YOUR CONNECTION STRING HERE'; exports.handler = async function(event, context) { // Make sure to add this so you can re-use `conn` between function calls. // See https://www.mongodb.com/blog/post/serverless-development-with-nodejs-aws-lambda-mongodb-atlas context.callbackWaitsForEmptyEventLoop = false; // Because `conn` is in the global scope, Lambda may retain it between // function calls thanks to `callbackWaitsForEmptyEventLoop`. // This means your Lambda function doesn't have to go through the // potentially expensive process of connecting to MongoDB every time. if (conn == null) { conn = mongoose.createConnection(uri, { // and tell the MongoDB driver to not wait more than 5 seconds // before erroring out if it isn't connected serverSelectionTimeoutMS: 5000 }); // `await`ing connection after assigning to the `conn` variable // to avoid multiple function calls creating new connections await conn; conn.model('Test', new mongoose.Schema({ name: String })); } const M = conn.model('Test'); const doc = await M.findOne(); console.log(doc); return doc; }; Sin embargo, callbackWaitsForEmptyEventLoop no está configurado en su ejemplo de ayuda:
'use strict'; const mongoose = require('mongoose'); let conn = null; const uri = 'YOUR CONNECTION STRING HERE'; exports.connect = async function() { if (conn == null) { conn = mongoose.createConnection(uri, { serverSelectionTimeoutMS: 5000 }); // `await`ing connection after assigning to the `conn` variable // to avoid multiple function calls creating new connections await conn; } return conn; };Versiones del paquete:
"mongodb": "^4.3.0", "mongoose": "^6.1.6",