怎样用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')));
	}
})

请问各位大哥有什么比较好的办法吗?跪求啊


7 回复

要在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. 创建一个中间件来检测用户代理。
  2. 使用不同的路由处理程序来响应不同类型的请求。

示例代码

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 字段,以确定请求是否来自移动设备。
  • 两个路由处理器normalRoutermobileRouter 分别处理普通端和移动端的请求。
  • 路由分发中间件:根据请求是否来自移动设备,将请求分发到相应的路由处理器。

这种方法不仅使代码更加整洁,而且易于维护和扩展。

回到顶部