【问题标题】:How to set local variables to be used in all ejs files如何设置要在所有 ejs 文件中使用的局部变量
【发布时间】:2020-10-23 12:42:10
【问题描述】:

我在/login 路由器中设置局部变量,就像这段代码一样 res.locals.username = data[0].username; 我使用console.log 输出data[0].usernameres.locals.username,它显示了用户名。

exports.login = function (req,res,next) {
var username = req.param("username");
var password = req.param("password");

con.query("select * from user where username = '"+username+"' and password = '"+password+"'",function (err,data) {
    if(err) {
        throw err;
    }else {
        if (data.length > 0) {
            if (data[0].username === username && data[0].password === password) {
                console.log(data);
                req.session.userID = data[0].id;
                req.session.username = data[0].username;
                res.locals.username = data[0].username;
                res.redirect("/home");
                next();
            }
    }
});
}; 

exports.home = function (req,res,next){
    if(req.session.userID && req.session.username) {
        res.render('home');
    }
}

但是当我尝试在我的 ejs 中显示“用户名”局部变量时,它显示用户名未定义。这是ejs文件

<html>
     <head>
          <title></title>
     </head>
         <body>
      <%= username %>
     </body>
    </html>

它也返回错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:482:11)
    at ServerResponse.header (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\response.js:170:12)
    at done (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\response.js:1004:10)
    at tryHandleCache (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\ejs\lib\ejs.js:257:5)
    at View.exports.renderFile [as engine] (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\ejs\lib\ejs.js:480:10)
    at View.render (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\view.js:135:8)
    at tryRender (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\application.js:640:10)
    at Function.render (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (C:\xamppp\htdocs\belajarnode\latihancrudajax2\node_modules\express\lib\response.js:1008:7)
GET /home 500 10.334 ms - 1627

这是我的 app.js 文件

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');

var app = express();

var user = function (req,res,next){
  req.date = Date.now();
  next();
};
app.use(user);
app.use(session({
  secret: 'secret'
}));

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');



// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

这是我的路线文件

var express = require('express');
var router = express.Router();
var controllerdata2 = require('../controller/munculindata');
//---------------

var con = require('../koneksi').con;
function munculindata(res) {
    con.query("select * from lat2", function (err, result) {
        if (err) {
            throw err;
        } else {
            res.render("index", {
                data: result
            });
        }
    });
}

/* GET home page. */
router.post('/login',controllerdata2.login);
router.get('/', controllerdata2.list_data);
router.get('/register',controllerdata2.register);
router.get('/home',controllerdata2.home);
router.get('/logout',function (req,res,next) {

});
router.get('/delete/:id',function (req,res,next) {
    var id = req.params.id;
    con.query("delete from lat2 where id = "+id,function (err) {
      if(err)
        throw err;
      else
          munculindata(res)
    });
});

module.exports = router;

【问题讨论】:

  • 您可以发布您的routes/index 文件吗?
  • @dimitristseggenes 完成

标签: node.js express ejs node-modules


【解决方案1】:

你必须把你的locals 放在你的路由方法之外的路由文件中。例如,在您的 routes/index 文件中,您可以通过这种方式使用本地变量:

router.use(function (req, res, next) {
    res.locals.username = req.username;
    next();
});
/* GET home page. */
router.post('/login',controllerdata2.login);
router.get('/', controllerdata2.list_data);
router.get('/register',controllerdata2.register);
router.get('/home',controllerdata2.home);
...

因此,在您导出的每种方法中,您都可以访问username
在您当前的代码中,当您在 controllerdata2 中调用 home 方法时,您无权访问 username,因为它尚未使用 res.locals 定义。按照我向您展示的方式,res.locals 将为您的 controllerdata2 控制器中的每个方法定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多