Node.js服务器持续加载无响应问题求助(附代码)
问题排查与修复方案
核心问题分析
服务器无控制台输出且持续加载,主要是中间件使用错误导致请求处理阻塞,同时存在几处逻辑缺陷。
具体修复步骤
CORS中间件初始化错误
原代码中app.use(cors);未调用cors()函数,直接传递函数本身会导致Express无法正确执行中间件,请求被卡住。修正为:app.use(cors());缺失Passport Session中间件
使用serializeUser和deserializeUser时,必须添加passport.session()来维护用户会话,否则Passport无法处理认证后的会话持久化。在passport.initialize()后添加:app.use(passport.session());响应逻辑冲突
/twitter/return路由中,res.send()会结束HTTP响应,后续res.redirect()无法执行。可以合并逻辑,通过客户端脚本完成消息发送和跳转:res.send('<script>window.opener.postMessage("authenticated", "*"); window.opener.location.href = "http://localhost:4200/home"; window.close();</script>');
修复后的完整代码
var express = require('express'); const cors = require('cors'); var session = require('express-session'); var passport = require('passport'); var logger = require('morgan'); const { Strategy } = require('passport-twitter').Strategy; var app = express(); // Configure sessions and passport app.use(cors()); app.use(logger('dev')); app.use(session({ secret: "secret", resave: true, saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); // 添加这行 passport.use(new Strategy({ consumerKey: "your-consumer-key", consumerSecret: "your-consumer-secret", callbackURL: 'http://localhost:3000/twitter/return' }, function (token, tokenSecret, profile, callback) { return callback(null, profile); })); passport.serializeUser(function (user, callback) { callback(null, user); }) passport.deserializeUser(function (obj, callback) { callback(null, obj); }) app.get('/sign-in', (req, res) => { res.redirect('http://localhost:4200/sign-in'); }); app.get('/home', (req, res) => { res.redirect('http://localhost:4200/home'); }); app.get('/', (req, res) => { res.redirect('http://localhost:4200/'); }); app.get('/twitter/login', passport.authenticate('twitter')); app.get('/twitter/return', passport.authenticate('twitter', { failureRedirect: '/sign-in' }), function (req, res) { // 合并消息发送和跳转逻辑 res.send('<script>window.opener.postMessage("authenticated", "*"); window.opener.location.href = "http://localhost:4200/home"; window.close();</script>'); }); // Start the server const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server is running on port ${port}`); });
内容的提问来源于stack exchange,提问作者caesar2243
相关产品推荐
相关产品推荐

