我想在ctx.session.userID有值时将登录按钮更改为注销,我尝试使用ejs引擎,但它不起作用,有什么问题吗,或者其他更好的方法。这是server.js:
const M = require('./model')
const Koa = require('koa')
var serve = require('koa-static')
const session = require('koa-session')
var KoaRouter = require('koa-router')
var koaLogger = require('koa-logger')
const koaBody = require('koa-body')
const views = require('koa-views')
var app = new Koa()
const router = new KoaRouter()
app.use(views('view', {map:{html:'ejs'}}))
app.use(koaLogger())
app.use(koaBody())
app.use(router.routes())
app.use(serve(__dirname + '/public'));
app.keys = ['*@&))9kdjafda;983']
const CONFIG = {
key: 'd**@&(_034k3q3&@^(!$!',
maxAge: 86400000
}
app.use(session(CONFIG, app))
router
.get('/', async (ctx) => {
let title = 'ejs test'
let userid = ctx.session.userID
await ctx.render('index',{
title, userid
})
})
.post('/login', login)
.get('/error', async (ctx)=> {
await ctx.render('error',{})
})
async function login(ctx){
let {id, password} = ctx.request.body
console.log("test:",id,password)
if ( await M.get(id,password) != null){
ctx.session.userID = id
ctx.redirect('/')
console.log('login success')
}
else {
ctx.redirect('/error')
}
}这是index.html的一部分:
<% if (userid == null){ %>
<a href="/login">Login</a>
<% } else { %>
<a href="/logout">Logout</a>
<% } %>发布于 2019-12-17 23:19:55
在get('/')路由函数中,使用的会话变量与在login()函数中设置的会话变量不同。将get('/')函数改为大写为ID的let userid = ctx.session.userID,并在发送到模板之前将其记录到控制台,以确保变量确实设置正确。
发布于 2021-02-25 17:31:27
我假设您在此应用程序中使用的是session。在index.html中,您可以使用以下Ejs代码检查状态是否已登录:
<li id="login">
<a href="<%= logStatus==='out'?'login':'logout'%>">
<%= logStatus==='out'?'LOGIN':'LOGOUT'%>
</a>
</li>
之后,您可以通过Node.js为Node.js代码中使用的每个res.render()函数传递登录和注销的状态,方法如下:
res.render("[your route name]", { logStatus:`${req.session.user? 'in':'out'}` });
例如:
app.get("/upload", checkSignIn, (req, res) => {
res.render("upload", { logStatus:`${req.session.user? 'in':'out'}` });
});
注意:每次渲染都要传递logStatus以避免错误,而且你不需要改变其中的任何东西,它会自动检查会话的状态并发送状态。
如果您的会话名称不同,请在会话的req.session.name中更改它。例如:如果我有一个类似autoTocken的会话名称,那么它将如下所示:
app.get("/upload", checkSignIn, (req, res) => {
res.render("upload", { logStatus:`${req.session.autoTocken ? 'in':'out'}` });
});
https://stackoverflow.com/questions/59377098
复制相似问题