/userId/otherId 这两个都是不定的怎么写路由规则 我在exress中文手册那里没有看到对应的,只有一个/user/:id/:operation?这样类似的规则 然后我这样写/:user/:id不行, 请问怎么解决, 难道express的路由规则只能如此生硬??
你怎么判断 /: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,再造个轮子出来,你就懂了
注意一下路由的顺序。一般情况下,静态的路由放在参数化路由的前面就没问题了。