/userId/otherId 这两个都是不定的怎么写路由规则
发布于 2年前 作者 kkeys 1363 次浏览

/userId/otherId 这两个都是不定的怎么写路由规则 我在exress中文手册那里没有看到对应的,只有一个/user/:id/:operation?这样类似的规则 然后我这样写/:user/:id不行, 请问怎么解决, 难道express的路由规则只能如此生硬??

16 回复

你怎么判断 /:user/:id 这样写不行的? 怎么测试?

/:user/:id 是可以的,建议检查一下get post 试试app.all,查看一下node输出的日志 另,可以用正则做router

怎么说呢,情况很诡异,我改成/:user/:id之后, / 这个路由下面的网站打开就读取不到所有public里面的css和js文件了, 我再把规则改成/user/:id又没事了, 真心不知道这是什么情况

我回复了下具体怎么不行的,如果你愿意帮忙,看看楼上的回复吧,谢谢

你这个路由处理是在资源文件前面的,比如资源文件的路径是**/public/style.css**,那么也会匹配到**/:user/:id中,这样就有冲突**了,因此你需要像下面这样判断一下:

app.get('/:user/:id', function (req, res, next) {
  // 判断:user是否为public,如果是则认为这是请求资源文件,不做处理
  if (req.params.user === 'public') return next();
  // ...
  // 该干嘛干嘛去
});

嗯,如果你的静态文件的格式是这样的:/stylesheets/xxx.css,这就直接符合你的/:user/:id的路由啊,这样就不会路由到static了,建议app.use(express.static(__dirname + '/public')); 换成app.use(‘/public’,express.static(__dirname + '/public'));然后css和js的引用前面加上/public,这样应该就可以了

@leizongmin 呵呵,我猛一看,突然觉得真理来临了,刚想回复感谢大神的,可是一试,还是不行…………情况依旧

@kkeys 关键是不是/public/style.css, 一般不是/public吧

@saber 没看到你的代码怎样,只能胡乱猜了

@leizongmin app.set('views’, __dirname + ‘/views’); app.set(‘view engine’, ‘ejs’); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ secret:’24 hours each day equals 24Hed hahaha’ })) app.use(express.router(routes)); app.use(express.static(__dirname + ‘/public’));

这是configure 然后 我的css,js文件放在public的javascript和stylesheet文件夹下面

app.get('/:user/:id’,function(req,res,next){…} 出错 app.get('/user/:id’,function(req,res,next){…} 就没事了

@leizongmin app.set('views’, __dirname + ‘/views’); app.set(‘view engine’, ‘ejs’); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ secret:’24 hours each day equals 24Hed hahaha’ })) app.use(express.router(routes)); app.use(express.static(__dirname + ‘/public’));

这是configure 然后 我的css,js文件放在public的javascript和stylesheet文件夹下面

app.get('/:user/:id’,function(req,res,next){…} 出错 app.get('/user/:id’,function(req,res,next){…} 就没事了

var express = require(‘express’) , routes = require(‘./routes’);

这是我app.js 引入的模块 routes下面只有index。js一个文件 内容格式如下 var crypto = require(‘crypto’); var url = require(‘url’); var User = require(‘…/node_modules/user’); var mysql = require(‘mysql-native’);

modules.exports = function(app){ app.get('/’,function(req,res,next){…} }

@kkeys 呵呵,我猛一看,以为我错了,可是一试,还是没问题啊…………楼主淡定点啊

var express = require('express')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use('/public', express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/:user/:id', function (req, res, next) {
  if (req.params.user === 'public') return next();
  
  res.send('user=' + req.params.user + '<br>id=' + req.params.id);
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

运行这个文件,把资源文件放在public目录中,比如文件为public/ooxx.gif,在浏览器中输入http://127.0.0.1:3000/public/ooxx.gif 即可看到图片文件,打开网址 http://127.0.0.1:3000/ooxx/xxoo 则会看到另外的输出信息。

@saber@leizongmin 谢谢,问题解决了,可以问下你们是怎么学习node的?

仿照connect或者express,再造个轮子出来,你就懂了

注意一下路由的顺序。一般情况下,静态的路由放在参数化路由的前面就没问题了。

回到顶部