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谢谢你提出来。我现在正在尝试,看这个:。我的问题是,如果查询没有返回任何内容,那么什么也不会发生!