怎样用express.router很好的控制Nodejs中mobile网页和普通网页的渲染?
怎样用express.router很好的控制Nodejs中mobile网页和普通网页的渲染?
其实我可以轻松地在每个router里写上判断,例如:
router.get('/',function(req, res){
if (isTablet) {
res.render('mobileIndex')
} else {
res.render('index')
}
});
router.get('list',function(req, res){
if (isTablet) {
res.render('mobileList')
} else {
res.render('list')
}
});
但这样未免太丑陋了
我想这样:
app.use(function (req, res, next) {
if (req.useragent == isTablet) {
router = mobileRouter
} else {
router = router
}
next()
})
mobileRouter.get('/',function(req, res){
res.render('index')
});
router.get('/',function(req, res){
res.render('index')
});
- 注:这些都是伪代码*
结果我发现如果在app.use里动态更改router是没用的,但也没报错,只是不执行,页面会500。
甚至我想动态的更改静态目录,这样我就不用在意img.src到底该写mobile/img还是/img了
app.use(function (req, res) {
if(req.useragent == isTablet) {
app.use(express.static(path.join(__dirname, 'dest')));
} else {
app.use(express.static(path.join(__dirname, 'dest/mobile')));
}
})
请问各位大哥有什么比较好的办法吗?跪求啊
要在Express应用中更好地控制移动设备和普通设备的网页渲染,可以利用中间件来动态选择不同的路由或模板。虽然直接修改router
变量不可行,但可以通过创建一个中间件来决定使用哪个路由器或者模板。
以下是一个具体的实现方法:
步骤1:创建两个路由器
首先,我们需要创建两个路由器:一个用于处理普通设备的请求,另一个用于处理移动设备的请求。
const express = require('express');
const app = express();
// 创建普通设备路由器
const mainRouter = express.Router();
mainRouter.get('/', (req, res) => {
res.render('index');
});
// 创建移动设备路由器
const mobileRouter = express.Router();
mobileRouter.get('/', (req, res) => {
res.render('mobileIndex');
});
步骤2:创建中间件来选择合适的路由器
接下来,我们创建一个中间件来根据用户代理字符串决定使用哪个路由器。
app.use((req, res, next) => {
const isMobile = req.headers['user-agent'].toLowerCase().includes('mobile');
if (isMobile) {
// 使用移动设备路由器
app.use(mobileRouter);
} else {
// 使用普通设备路由器
app.use(mainRouter);
}
next();
});
步骤3:配置视图引擎
为了简化模板的选择,可以在视图引擎中进行一些逻辑处理。例如,使用EJS模板引擎时,可以在渲染函数中添加逻辑来选择不同的模板。
app.set('views', './views'); // 设置视图路径
app.set('view engine', 'ejs'); // 设置视图引擎为 EJS
app.get('/', (req, res) => {
const isMobile = req.headers['user-agent'].toLowerCase().includes('mobile');
const template = isMobile ? 'mobileIndex' : 'index';
res.render(template);
});
步骤4:处理静态资源
对于静态资源,我们可以根据用户代理字符串来设置不同的静态文件目录。
app.use((req, res, next) => {
const isMobile = req.headers['user-agent'].toLowerCase().includes('mobile');
if (isMobile) {
app.use('/static', express.static(path.join(__dirname, 'public/mobile')));
} else {
app.use('/static', express.static(path.join(__dirname, 'public')));
}
next();
});
示例代码总结
const express = require('express');
const path = require('path');
const app = express();
// 创建普通设备路由器
const mainRouter = express.Router();
mainRouter.get('/', (req, res) => {
res.render('index');
});
// 创建移动设备路由器
const mobileRouter = express.Router();
mobileRouter.get('/', (req, res) => {
res.render('mobileIndex');
});
app.set('views', './views'); // 设置视图路径
app.set('view engine', 'ejs'); // 设置视图引擎为 EJS
app.use((req, res, next) => {
const isMobile = req.headers['user-agent'].toLowerCase().includes('mobile');
if (isMobile) {
app.use('/static', express.static(path.join(__dirname, 'public/mobile')));
app.use(mobileRouter);
} else {
app.use('/static', express.static(path.join(__dirname, 'public')));
app.use(mainRouter);
}
next();
});
app.get('/', (req, res) => {
const isMobile = req.headers['user-agent'].toLowerCase().includes('mobile');
const template = isMobile ? 'mobileIndex' : 'index';
res.render(template);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
通过这种方式,你可以更灵活地管理和区分不同类型的用户请求,并且代码结构更加清晰。
感觉这种情况下应该是组织你的文件结构更好一些 一般来说 手机站 PC站的数据基本一样,或者些许不同 是不是可以考虑 单独一个文件夹、。
app.use(function (req, res, next) {
if (req.useragent == isTablet) {
path = 'wap/'
} else {
path = ''
}
next()
})
router.get(’/’,function(req, res){
res.render(path+‘index’)
});
甚至你是不是可以重写render方法来直接实现更简单?
抽像个base.js出来, 里面实现render并判断浏览器类型
router里面调用 base.render(req, res, ‘index’);
我是这么做的=。=
最好做成responsive的html,这样就不用区分mobile和pc了
能不能 if(req.useragent == isTablet)res.redirect(’/mobile’+req.url);
var views = isTablet ? ‘mobile’ : ‘views’; app.set(‘views’, views);
为了更好地处理移动端和普通端的渲染问题,可以使用中间件来检测请求来源,并根据不同的设备类型将请求分发到不同的路由。以下是一种更优雅的方式来实现这个需求:
- 创建一个中间件来检测用户代理。
- 使用不同的路由处理程序来响应不同类型的请求。
示例代码
1. 创建一个中间件来检测用户代理
// middlewares/userAgentChecker.js
module.exports = function(req, res, next) {
req.isMobile = /Mobi/.test(req.headers['user-agent']);
next();
};
2. 在应用中使用这个中间件
const express = require('express');
const app = express();
const userAgentChecker = require('./middlewares/userAgentChecker');
app.use(userAgentChecker);
// 普通端路由
const normalRouter = express.Router();
normalRouter.get('/', (req, res) => {
res.render('index');
});
// 移动端路由
const mobileRouter = express.Router();
mobileRouter.get('/', (req, res) => {
res.render('mobileIndex');
});
// 路由分发
app.use((req, res, next) => {
if (req.isMobile) {
return mobileRouter(req, res, next);
} else {
return normalRouter(req, res, next);
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 中间件
userAgentChecker
:检查请求头中的User-Agent
字段,以确定请求是否来自移动设备。 - 两个路由处理器:
normalRouter
和mobileRouter
分别处理普通端和移动端的请求。 - 路由分发中间件:根据请求是否来自移动设备,将请求分发到相应的路由处理器。
这种方法不仅使代码更加整洁,而且易于维护和扩展。