Javascript 中间件执行所有功能,而不是刚刚指定的功能
我有这个中间件功能:Javascript 中间件执行所有功能,而不是刚刚指定的功能,javascript,node.js,Javascript,Node.js,我有这个中间件功能: function authCheck (req, res, next) { if (req.session.loggedin) { next(); } else { req.session.destroy(); res.redirect('/login') } } module.exports = { authCheck } 然后在我的index.js页面的根目录中检索它 const {
function authCheck (req, res, next) {
if (req.session.loggedin) {
next();
} else {
req.session.destroy();
res.redirect('/login')
}
}
module.exports = { authCheck }
然后在我的index.js
页面的根目录中检索它
const { authCheck } = require('./middleware/auth')
app.use(authCheck)
至少可以说这有点好。基本上,我有一个routes
文件夹,其中有一个名为payments.js
的文件。在该文件中,我有以下内容:
const {
response
} = require("express");
var express = require("express");
const session = require('express-session');
var ibmdb = require("ibm_db");
var alert = require("alert");
const {
render
} = require("ejs");
var nodemailer = require("nodemailer");
const bcrypt = require("bcrypt");
const http = require('http').Server(express);
const io = require('socket.io')(http);
const saltRounds = 10;
var crypto = require("crypto");
const app = express();
//initialize session
app.use(session({
secret: 'secret-key',
resave: false,
saveUninitialized: false,
maxage: 10
}))
app.get('/payment', (req, res) => {
res.render('paymentCode.ejs')
})
app.post('/paymentsPage', (req, res) => {
var userCode = req.body.code;
var code = "select * from testclients"
ibmdb.open(ibmdbconnMaster, function(err, conn) {
if (err) return console.log(err);
conn.query(code, function(err, rows) {
if (err) {
console.log(err);
}
for(var i = 0; i < rows.length; i++) {
if (rows[i]["CODE"] != userCode) {
console.log("unsuccessful")
} else {
res.render("makePayment", {
page_title: "makePayment",
data: rows,
})
}
}
conn.close(function() {
// console.log("closed the function /index");
});
});
});
})
module.exports = app
const{
响应
}=要求(“明示”);
var express=要求(“快递”);
const session=require('express-session');
var ibmdb=require(“ibm_db”);
风险值警报=要求(“警报”);
常数{
提供
}=要求(“ejs”);
var nodeEmailer=require(“nodeEmailer”);
常量bcrypt=要求(“bcrypt”);
const http=require('http')。服务器(express);
const io=require('socket.io')(http);
常数salthards=10;
var crypto=要求(“加密”);
常量app=express();
//初始化会话
应用程序使用(会话)({
秘密:“秘密密钥”,
resave:false,
saveUninitialized:false,
最大年龄:10
}))
app.get(“/payment”,(请求、回复)=>{
res.render('paymentCode.ejs')
})
app.post(“/paymentsPage”,(请求、回复)=>{
var userCode=req.body.code;
var code=“从TestClient选择*
open(ibmdbconnMaster,函数(err,conn){
if(err)返回console.log(err);
conn.query(代码、函数(错误、行){
如果(错误){
控制台日志(err);
}
对于(变量i=0;i
标准的东西。我绝对没有
authCheck
可以在那里找到,但是出于某种奇怪的原因,它正在这个函数上执行authCheck
功能,尽管我不需要它。这是正常的,还是我遗漏了什么?如果需要,我可以共享index.js
页面这里的问题是,您使用的是从payments.js
导出的相同的app
实例。因此,当您在index.js
中执行app.use(authCheck)
时,它将中间件应用于整个应用程序,而不是特定的路由
为了实现您想要的,您可以使用express.Router
。
请参阅此链接
下面是上面链接中的一些示例代码。
这是您的payments.js
(忽略路线)
var express=require('express'))
var router=express.router()
//特定于此路由器的中间件
路由器。使用(函数timeLog(req、res、next){
console.log('Time:',Date.now())
下一个()
})
//定义主页路径
router.get('/',函数(req,res){
res.send('鸟类主页')
})
//定义“关于路线”
router.get('/about',函数(req,res){
res.send(‘关于鸟类’)
})
module.exports=路由器
在你的index.js
中,使用它如下:
var payments=require('./payments.js')
// ...
应用程序使用(“/payments”,payments)
编辑:我刚刚粘贴了文档中的示例代码,以演示如何使用
express.Router
将中间件应用于特定路由。请参阅文档以获得更清晰的理解。因为您已将中间件添加为
app.use(authCheck)
当然,应该为服务中的所有端点调用它。
如果需要为特定路由指定中间件,可以通过
router.get('/user', authCheck, function (req, res) {
res.send('Profile')
})
或者,您可以在您的中间件中指定逻辑,以忽略不需要身份验证的路由,您可以通过正则表达式来完成,或者通过检查特定路由并在根目录中使用app.use(authCheck)
。
比如说
function authCheck(req, res, next) {
const nonSecurePaths = ['/user', '/example'];
if (req.session.loggedin || nonSecurePaths.includes(req.path)) {
next();
} else {
req.session.destroy();
res.redirect('/login');
}
}
此外,您应该在查询中直接选择带有WHERE子句的代码,而不是循环查询中的每一行table@LawrenceCherone谢谢你提出来。我现在正在尝试,看这个:。我的问题是,如果查询没有返回任何内容,那么什么也不会发生!