gpt4 book ai didi

node.js - 停止express4中的中间件链

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:26 26 4
gpt4 key购买 nike

下面是添加了中间件函数“checkLogin”的代码。如果用户未登录,echeckLogin 中间件应重定向到登录页面。如果用户登录,则应呈现请求的页面。

var express = require('express');
var router = express.Router();
var mongoUri = 'mongodb://localhost/mydb';
var MongoClient = require('mongodb').MongoClient;

function mongoDBConnect(req, res, next) {
MongoClient.connect('mongodb://localhost/gadda_db', function(err, db) {
if(!err) {
req.db = db;
next();
} else {
res.send('unable to connect to mongodb: err = ' + err);
}
});
};

function checkLogin(req, res, next) {
if (req.loggedin) {
next();
return;
}

if (req.loggedin && req.url === '/login') {
res.redirect('http://' + 'localhost:3000' + '/game/my_game');
return;
}

if (!req.loggedin && req.url === '/login') {
next();
return;
}
req.db.collection('game_users', function (err, collection) {
if (err) {
res.send("error while reading game_users: err " + err);
}
collection.findOne({user: req.cookies.user, password: req.cookies.password},
function (err, user) {
if (err) {
res.send("error here");
return;
}
req.loggedin = true;
next();
return;
});
});

res.redirect('login');
return;
};

router.use(mongoDBConnect);
router.use(checkLogin);

router.get('/', function(req, res) {
res.redirect('http://' + 'localhost:3000' + '/game/my_game');
});

router.get('/login', function(req, res) {
res.render('gadda_login', {title: 'gadda', error: ''});
});

当向 localhost:3000/gadda 发送请求时,服务器上会打印以下错误消息

GET /gadda/ 302 34ms - 66b Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) at ServerResponse.res.set.res.header (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/response.js:551:10) at ServerResponse.res.send (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/response.js:132:12) at fn (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/response.js:778:10) at View.exports.renderFile [as engine] (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/ejs/lib/ejs.js:318:3) at View.render (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/view.js:76:8) at Function.app.render (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/application.js:519:10) at ServerResponse.res.render (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/response.js:782:7) at Layer.module.exports [as handle] (/home/hhk/src/nodejs_projects/gadda_v2/app.js:54:9) at trim_prefix (/home/hhk/src/nodejs_projects/gadda_v2/node_modules/express/lib/router/index.js:252:17) router.get /login GET /gadda/login 200 11ms - 546b GET /stylesheets/style.css 200 4ms - 110b

最佳答案

从您上面粘贴的代码看来,您在等待数据库查找返回之前正在重定向到“登录”。尝试将您的 checkLogin 函数重构为以下内容:

function checkLogin(req, res, next) {
if (req.loggedin) {
if (req.url === '/login') {
res.redirect('http://' + 'localhost:3000' + '/game/my_game');
return;
}
next();
return;
}

if (!req.loggedin && req.url === '/login') {
next();
return;
}

req.db.collection('game_users', function(err, collection) {
if (err) {
res.send("error while reading game_users: err " + err);
return;
}

collection.findOne({
user: req.cookies.user,
password: req.cookies.password
}, function(err, user) {
if (err) {
res.send("error here");
return;
}

if (user) {
req.loggedin = true;
next();
return;
} else {
res.redirect('/login');
return;
}
});
});
}

我已将重定向移动到/login,仅当数据库调用返回而没有匹配的用户时才会发生。这意味着您已搜索但未找到任何匹配项,这意味着提供的用户和密码(包含在 cookie 中?)不正确。

这里的要点是只执行一次 res.sendres.redirect 一次,如果我们不应该在中间件,然后只需调用 next() 即可。如果不调用 next(),您的代码将不会命中路由代码。

但这里要小心,因为此代码不允许任何请求到达其目的地,除非它是经过身份验证的请求。这包括网站图标或 Assets 等内容。

关于node.js - 停止express4中的中间件链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com