Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在呈现express get router节点之前执行函数_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js 在呈现express get router节点之前执行函数

Node.js 在呈现express get router节点之前执行函数,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,每次调用express router时,我都要执行一个函数 我知道我可以简单地将该函数放在app.get函数中,但我想多次调用同一个函数 这是我的router.js文件: var Setting = require('../models/setting'); module.exports = function(app, passport) { // ===================================== // HOME PAGE (with login links) ===

每次调用express router时,我都要执行一个函数

我知道我可以简单地将该函数放在
app.get
函数中,但我想多次调用同一个函数

这是我的router.js文件

var Setting = require('../models/setting');
module.exports = function(app, passport) {

// =====================================
// HOME PAGE (with login links) ========
// =====================================
app.get('/', function(req, res) {
    Setting.findOne(function(err, setting) {
        if (err)
            throw err;
        // console.log(setting);
        res.render('index', { title: 'eduBird | Reach the glory', setting: setting }); // load the index file
    });
});

// =====================================
// LOGIN ===============================
// =====================================
// show the login form
app.get('/login', sabSettings, function(req, res) {

    // render the page and pass in any flash data if it exists
    res.render('login', {
        message: req.flash('loginMessage'),
        errors: req.flash('error'),
        title: 'Login | eduBird',
        setting: setting
    });
});

// process the login form

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/profile',
    failureRedirect: '/login',
    failureFlash: true
}));

// =====================================
// SIGNUP ==============================
// =====================================
// show the signup form
app.get('/signup', function(req, res) {

    // render the page and pass in any flash data if it exists
    res.render('signup', {
        message: req.flash('signupMessage'),
        errors: req.flash('error'),
        title: 'Register | eduBird',
        setting: req.setting
    });
});

// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/profile',
    failureRedirect: '/signup',
    failureFlash: true
}));

// app.post('/signup', function(req, res) {
//     console.log(req);
// });

// =====================================
// PROFILE SECTION =====================
// =====================================
// we will want this protected so you have to be logged in to visit
// we will use route middleware to verify this (the isLoggedIn function)
app.get('/profile', isLoggedIn, sabSettings, function(req, res) {
    res.render('profile', {
        user: req.user, // get the user out of session and pass to template
        title: req.user.local.name + "'s profile | eduBird",
        setting: req.setting
    });
});

// =====================================
// LOGOUT ==============================
// =====================================
app.get('/logout', function(req, res) {
    req.logout();
    res.redirect('/');
});
};

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

// if user is authenticated in the session, carry on 
if (req.isAuthenticated())
    return next();

  // if they aren't redirect them to the home page
   res.redirect('/login');
  };

function sabSettings(next) {
Setting.findOne(function(err, setting) {
    if (err)
        throw err;
    console.log('sabSetting function executed');
    console.log(setting);
    console.log('~~~~~~~~~~~');
    // return setting;
    return next(setting);
});
};
在这里,我使用了一个执行良好的
isLoggedIn
示例,但同样的示例无法用于
sabSettings()
,它将所有设置配置从数据库传递到我的
/login
/signup
/profile
和/或
所有路由

console.log(设置)
正在将所有数据返回到我的控制台,但我收到一个错误,说明:

 throw er; // Unhandled 'error' event
  ^

 TypeError: next is not a function
  at C:\Users\animeshweb\Desktop\projects\eb-v2\routes\routes.js:106:16
你可以看到我在app.get(“/”)中嵌入了一个函数来获得相同的结果,但是我希望这个函数可以在任何地方执行,所以我需要一个单独的函数

更新

我根据请求更新我的routes.js:

function sabSettings(req, res, next) {
Setting.findOne(function(err, setting) {
    if (err)
        next(err);
    console.log('sabSetting function executed');
    console.log(setting);
    console.log('~~~~~~~~~~~');
    req.setting = setting;
    next();
});
})

我还制作了上面的
Setting=require(myModelURL)
,这对于
route.get'/'
来说效果很好

*这是我的view/layout.pug文件`

link(rel='icon', type='image/png', href=setting.logo.logo16 sizes='16x16')
link(rel='icon', type='image/png', href=setting.logo.logo32 sizes='32x32')
link(rel='icon', type='image/png', href=setting.logo.logo128 sizes='128x128')
在adminlayout0.pug中同样可以正常工作


谢谢。

您已声明
sabSettings
错误。中间件传递了三个参数,因此您的声明应如下所示:

function sabSetting(req, res, next) {
   // function logic here
}
由于您命名的
next
参数的位置错误,因此当您试图调用它时,它不是一个函数

而且,我不知道您为什么要尝试执行
返回下一步(设置)
。这将告诉Express您正在报告请求中的错误。如果您试图将
设置
值放在其他请求处理程序可以使用的地方,那么您可能希望将其放在
req
对象上,例如:

 req.setting = setting;    // put setting on the req object for other code to use
 next();                   // continue routing
此外,您不应该在中间件函数中执行
抛出err
。这根本不会做任何有用的事情,您的请求可能永远不会完成。相反,您应该在收到错误时处理它。当出现错误时,您可以切换到中间件中的某个备用策略,也可以使用
next(err)
或执行
res.status(500).send(…)
返回失败的请求

然后需要将
res.render()
更改为:

res.render('index', { title: 'eduBird | Reach the glory', setting: req.setting }); 
设置
变量现在存储在
req
对象中,因此您需要在那里引用它


无论您在哪里引用
setting

我都会将我的
sabsetting()
更新为前面提到的内容:函数sabSettings(req,res,next){setting.findOne(函数(err,setting){if(err)console.log('sabsetting函数已执行');console.log(设置);console.log('~~~~~~~~~~');req.setting=setting;next();});};但它仍然显示了一个错误,即“无法读取未定义的属性”logo“,我在问题中添加了我的.pug视图。我刚刚更新了我的问题,route.js
sabsetting()
?@AnimeshSingh-您是否查看了
设置
变量并查看它是否具有所需的
设置.logo
属性?调用
res.render()
时,需要传递
setting:req.setting
而不是
setting:setting
,因为这是存储
setting
变量的地方。是的,我应该添加
setting:req.setting
。在将
sabSettings
添加到
app.get('/signup')
之后,我打开了抛出错误的
signup
页面,这两个页面现在都工作正常。谢谢@jfriend00