【问题标题】:Express handler called again without client request在没有客户请求的情况下再次调用 Express 处理程序
【发布时间】:2021-12-13 01:02:39
【问题描述】:

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

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

Promise 需要相当长的时间才能解决。这是意料之中的。

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

此外,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 功能可以重新调用处理程序? 我可以禁用它吗? 还是有其他问题?提前感谢您的帮助。

【问题讨论】:

    标签: javascript node.js express express-router


    【解决方案1】:

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

    【讨论】:

    • It's a function call--that returns a function. 函数生成器在生态系统中经常使用;它可能看起来“关闭”,但需要注意。
    • 公平,我不知道 passport.js 是如何工作的!不过,除此之外 - 您是从浏览器还是从 Postman 调用?我遇到过浏览器尝试自行提交另一个请求的情况。特别是 Safari
    • Oooooo 2 分钟听起来非常接近 express 的默认超时设置,即 120 秒!你能在函数启动时试试这个res.connection.setTimeout(0);吗?
    • 是的,就是这样! :) 你可以更新你的答案,谢谢!
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2014-05-11
    • 2021-06-15
    • 2015-06-17
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多