TypeError: res.render is not a function

TypeError: res.render is not a function

我遇到了 nodejs 的问题 res.render,它告诉我它不是函数。我查看了有关堆栈溢出的其他帖子,但它们没有解决我的问题。

问题来了....

我的应用程序有一个控制器,名为 auth.js

在其中,它导出了这个名为 updateDiscount

的函数
exports.updateDiscount = (req,res,next) =>{

    const { discounts, email, filename, decide } = req.body;

    switch(decide){
        case "Approve":
            approve(discounts,email,filename,decide, req, res);
            break;
        case "Deny":
            deny(discounts,email,filename,decide, req, res);
            break;
        case "Defer":
            defer(discounts,email,filename,decide, req, res);
            break;
        default:
            return res.render('adminGrantPortal', {
                message: 'You selected an option from the -- Approve/Deny/Defer -- menu which does not exist. Please contact your system administrator'
            });
    }
}

接下来我有一个工作方法叫做批准。因此,当控制器收到批准消息(通过开关中的变量 decide )时,它将批准数据库中的用户折扣。同样,此方法有效...

approve = (discounts, email, filename, decide, req, res) =>{

    // get discount based on name
    mysqlConnection.query('SELECT id FROM discounts WHERE name=?', [discounts], async (error, results)=>{
        if(error){
            return res.render('adminGrantPortal',{
                message: 'One or more fields either, do not exist in the database, or were filled out incorrectly during your last action.'
            });
        }
        console.log('ayayay');
        console.log(results[0]);
        let discountID = results[0].id;

        // Set staus in files table
        mysqlConnection.query("UPDATE files SET status='approved' WHERE email=? AND filename=?", [email,filename], async (error,results)=>{
            if(error){
                return res.render('adminGrantPortal',{
                    message: 'Could not update users status, because it is not found in the database.'
                });
            }

            // Add to discounts_users
            mysqlConnection.query('INSERT INTO discounts_users (email,discountID) VALUES (?,?)',[email,discountID], async (error,results)=>{
                if(error){
                    return res.render('adminGrantPortal', {
                        message: 'Cannot update the database, maybe this user already has this discount.'
                    });
                }
                return res.render('adminGrantPortal', {
                    message: 'Approved discount eligibility successfully.'
                });
            });
        });
    });
}

现在,我有一个拒绝方法,这意味着当 req.body.decide = 'deny' 时它会出现在这里。这种方法给了我错误,特别是 console.log('success');

之后的那一行

deny = (discounts, email, filename, req, res) =>{
    // Set staus in files table
    mysqlConnection.query("UPDATE files SET status='denied' WHERE email=? AND filename=?", [email,filename], async (error,results)=>{
        if(error){
            console.log('error');
            return res.render('adminGrantPortal',{
                message: 'Could not update users status, because it is not found in the database.'
            });
        }
    });

    console.log('success');
    return res.render('adminGrantPortal', {
        message: 'Denied discount eligibility successfully.'
    });
}

为什么要这样做?

我已经缩小了一些不是的范围。

  1. 我相信从 mysql 连接返回的 'results' object 与我的 res object,这将控制 headers.
  2. 我相信这与我的 mysql 没有任何关系,因为我删除它看起来像这样...
deny = (discounts, email, filename, req, res) =>{
    console.log('success');
    return res.render('adminGrantPortal', {
        message: 'Denied discount eligibility successfully.'
    });
}

但是我仍然得到同样的错误....

TypeError: res.render is not a function
    at deny (C:\Users\Andrew\Desktop\Project\racf\client\controllers\auth.js:187:16)
    at exports.updateDiscount (C:\Users\Andrew\Desktop\Project\racf\client\controllers\auth.js:127:13)
    at Layer.handle [as handle_request] (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\Andrew\Desktop\Project\racf\node_modules\express\lib\router\index.js:174:3)

谁能帮我弄清楚我做错了什么?

调用 deny 函数时,您将 req 作为第 5 个参数传递,但您试图在函数内部将其用作 res。在 filename.

之后将 decide 添加到 deny 函数的参数列表
deny = (discounts, email, filename, decide, req, res) => {
  // ...
}