在没有客户请求的情况下再次调用 Express 处理程序

Express handler called again without client request

在下面的代码中,客户端 POST/somewhere 发送一些数据,然后执行路由处理程序回调。

在回调中,我正在等待 Promise 解决,然后再将一些结果发送回客户端。

Promise 需要相当长的时间才能解决。这是预期的。

我不知道需要多长时间,因为在 Promise 执行大约 2-3 分钟后,app.post('/somewhere') 处理程序再次被调用,即使客户端没有发出这样的请求(已检查)。这段时间客户端上没有activity,没有页面刷新,重定向..什么都没有。

此外,forSomethingReallySlow() 不会抛出任何错误,因为节点控制台上没有记录任何相关内容。我在 forSomethingReallySlow() 中有大量日志,其中一切正常,直到再次调用处理程序并 forSomethingReallySlow() 重新启动。

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 })

})

是否有一些内部 Express 功能可以在响应时间过长时重新调用处理程序? 我可以禁用它吗? 或者还有其他问题吗?提前感谢您的帮助。

Ooooooo 2 分钟听起来非常接近 express 上的默认超时设置,即 120 秒!你能试试这个 res.connection.setTimeout(0);功能何时开始?