在没有客户请求的情况下再次调用 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);功能何时开始?
在下面的代码中,客户端 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);功能何时开始?