/userId/otherId 这两个都是不定的怎么写路由规则 我在exress中文手册那里没有看到对应的,只有一个/user/:id/:operation?这样类似的规则 然后我这样写/:user/:id不行, 请问怎么解决, 难道express的路由规则只能如此生硬??
你怎么判断 /:user/:id 这样写不行的? 怎么测试?
/:user/:id 是可以的,建议检查一下get post 试试app.all,查看一下node输出的日志 另,可以用正则做router
/:user/:id
get
post
app.all
怎么说呢,情况很诡异,我改成/: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,这样应该就可以了
/stylesheets/xxx.css
app.use(express.static(__dirname + '/public'));
app.use(‘/public’,express.static(__dirname + '/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){…} 就没事了
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,再造个轮子出来,你就懂了
注意一下路由的顺序。一般情况下,静态的路由放在参数化路由的前面就没问题了。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
你怎么判断 /:user/:id 这样写不行的? 怎么测试?
/:user/:id是可以的,建议检查一下getpost试试app.all,查看一下node输出的日志 另,可以用正则做router怎么说呢,情况很诡异,我改成/:user/:id之后, / 这个路由下面的网站打开就读取不到所有public里面的css和js文件了, 我再把规则改成/user/:id又没事了, 真心不知道这是什么情况
我回复了下具体怎么不行的,如果你愿意帮忙,看看楼上的回复吧,谢谢
你这个路由处理是在资源文件前面的,比如资源文件的路径是**/public/style.css**,那么也会匹配到**/:user/:id中,这样就有冲突**了,因此你需要像下面这样判断一下:
嗯,如果你的静态文件的格式是这样的:
/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 呵呵,我猛一看,以为我错了,可是一试,还是没问题啊…………楼主淡定点啊
运行这个文件,把资源文件放在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,再造个轮子出来,你就懂了
注意一下路由的顺序。一般情况下,静态的路由放在参数化路由的前面就没问题了。