我在expressjs中遇到了res.render()的问题 我使用ajax来请求这条路线:
route.get('/about',authentication,(req,res)=>{
res.render('about');
});
我做了一些搜索,发现res.render
不适用于ajax调用
那么如何在没有res.render()
的情况下更改和呈现页面。
如果我删除了res.render
和console.log
,它实际上可以使用任何代码而不是res.render
(通过点击链接,我在带有ajax请求的标头中发送令牌然后在我的route我有一个认证中间件,它获取令牌,然后将用户重定向到about.ejs
页面)
我只想更改页面。任何想法都会帮助你们。 谢谢 这是前端请求:
$(document).ready(function(){
$('#about').click(function(){
// window.location.href='/about';
$.ajax({
method:'get',
url:'http://localhost:5000/about',
headers:{"authtoken":localStorage.getItem('authToken')}
}).done(()=>{
// window.location.href='/about';
}).catch(e=>console.log('header.ejs error'));
});
});
答案 0 :(得分:1)
步骤1:制作公开网址,例如http://your-web-site.com/redirect_destination.html
步骤2:在从前端发出ajax请求时,使用response
上的.redirect()
方法将用户重定向到该页面
修改强>
关键是,我认为通过发出ajax请求来呈现页面是不可能的。您可以使用.redirect()
方法准备一个呈现所需网页的网址,并将用户重定向到该网址。
答案 1 :(得分:0)
通常ajax
用于在没有刷新页面的情况下使用来自服务器的某些resposne来更新页面的一部分。如果您想导航到另一条路线而不是ajax,请使用表单提交或href
。如果你坚持使用ajax然后从服务器返回一个JSON并使用javascript进行更改
requestHandler=(req,res)=>{
res.json({data:{}})
}
答案 2 :(得分:0)
你的路由器不会呈现页面,它只会发送响应而我只是为了页面呈现,为什么你在点击事件上调用ajax请求。如果你不介意你可以写点击和更改window.location与你的逻辑路由器。它将呈现特定页面,因为您的路由器应该是这样的:
// about page route (http://localhost:8080/about)
router.get('/about',isAuthenticated, function(req, res) {
res.sendFile(path.join(__dirname+'/public/about.html'));
});
function isAuthenticated(req, res, next) {
// do any checks you want to in here
// CHECK THE USER STORED IN SESSION FOR A CUSTOM VARIABLE
// you can do this however you want with whatever variables you set up
if (req.user.authenticated)
return next();
// IF A USER ISN'T LOGGED IN, THEN REDIRECT THEM SOMEWHERE
res.redirect('/');
}
点击更改您的网址http://localhost:8080/about
答案 3 :(得分:0)
res.render
使用模板组成一个html页面,并将最终的组合结果从服务器发送到客户端。它不会在客户端窗口中发布页面呈现。
如果通过在浏览器的地址栏中输入URL来发出请求,则浏览器将执行请求并呈现服务器发送的结果。
如果您执行ajax请求,您将收到该响应,但您有责任在.done
回调中对其执行某些操作。如果您执行ajax请求,浏览器不会神奇地知道要对数据执行什么操作。而且因为你的.done
回调中没有任何内容,所以不会发生任何事情。
所以你必须做那样的事情:
.done(response => {
var bodyContent = response.match(/<body>(.*)<\/body>/)[1]
$('body').html(bodyContent);
})