En el código a continuación, el cliente POST
envía algunos datos a /somewhere
y luego se ejecuta la devolución de llamada del controlador de ruta.
Dentro de la devolución de llamada, estoy esperando que se resuelva una Promise
antes de enviar algún resultado al cliente.
The Promise tardará bastante tiempo en resolverse. Esto se espera.
No sé cuánto tiempo tomará porque alrededor de 2-3 minutos después de la ejecución de Promise, se vuelve a llamar al controlador app.post('/somewhere')
, aunque el cliente no hace tal solicitud (marcado). No hay actividad en el cliente durante todo este tiempo, no hay actualización de página, redirección... nada.
Además, no se generan errores desde forSomethingReallySlow()
ya que no se registra nada relevante en la consola de Node. Y tengo registros extensos dentro de forSomethingReallySlow()
donde todo funciona bien hasta que se vuelve a llamar al controlador y forSomethingReallySlow()
reinicia.
app.use(cors({ origin: '*', credentials: true, optionSuccessStatus: 200 })) app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', 'http://localhost:4200') res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization') res.header('Access-Control-Allow-Methods', 'POST, GET') next() }) app.use(cookieParser()) app.use(bodyParser.json({limit: "50mb"})); app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000})) app.use(session({ secret: 'googoogaga', resave: false, saveUninitialized: false })) app.use(passport.initialize()) app.use(passport.session()) passport.use(new FacebookStrategy({ clientID : FACEBOOK_APP_ID, clientSecret : FACEBOOK_APP_SECRET, callbackURL : "http://localhost:4200/facebook/callback", profileFields : ['id'] }, async(accessToken, refreshToken, profile, done) => { let facebookId = profile.id let userInDb = await DB.getUser() if (userInDb && userInDb.facebookId === facebookId) { await DB.updateUser({ accessToken }) done(null, userInDb) } else { let newUser = await DB.updateUser({ facebookId, accessToken }) done(null, newUser) } })) passport.serializeUser(function(user, done) { done(null, user) }) passport.deserializeUser(function(user, done) { done(null, user) }) app.post('/somewhere', ensureLoggedIn('/auth/facebook'), jsonParser, async function(req, res){ console.log('new POST request at: ', new Date()) let result = await forSomethingReallySlow(req.body) res.status(200).send({ result }) })
¿Hay alguna característica Express interna que vuelva a llamar a un controlador si tarda demasiado en responder? Y puedo desactivarlo? ¿O hay algo más mal? De forma anticipada, muchas gracias por su ayuda.
¡Oooooo, 2 minutos suena muy cerca de la configuración de tiempo de espera predeterminada en Express, que es de 120 segundos! ¿Puedes probar esto res.connection.setTimeout(0); justo cuando comienza la función?