关于node connect中间件的路由选择问题
发布于 9 年前 作者 kinglisky 4817 次浏览 最后一次编辑是 8 年前 来自 问答

路由选择的问题

在使用connect中间件时,我只想让:

app.use('/', (req,res,next)=>{........});

app.use('/home', (req,res,next)=>{........});

“/“和”/home"匹配正常,但是我随便试了一下”/hdgsjah",它不知为什么的就匹配到"/“目录底下,为什么”/abc"、"/dgks"…等目录也会被匹配,好像隐约记得路由规则好像也会匹配其子目录.

求解释,如何过滤掉其他未设置的路由。

我只想"/“匹配到”/“目录的路由,”/home"匹配到"/home",改如何解决?

ps(不要使用框架,用coonect解决),求大神支招。

付代码:

server.js

 const
 	connect = require('connect'),
 	static = require('serve-static'),
 	bodyParser = require('body-parser'),
 	http = require('http'),
 	fs = require('fs'),
 	route = require('./route/main'),
 	app = connect(),
 	port = process.env.VCAP_APP_PORT || 3000;

 app.use(static(__dirname + '/public'));
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({
 	extended: false
 }));
 app.use('/home', route.home);
 app.use('/', route.login);
 http.createServer(app).listen(port, () => {
 	console.log(`server run in the ${port}`);
 });

route/main.js

const
	fs = require('fs'),
	rLogin = {
		"GET": (req, res) => {
			fs.readFile('./public/login.html', (err, html) => {
				if (err) return console.log(err);
				res.writeHeader(200, {
					"Content-Type": "text/html"
				});
				res.write(html);
				res.end();
			});
		},
		"POST": (req, res) => {

		}
	},
	rHome = {
		"GET": (req, res) => {
			fs.readFile('./public/main.html', (err, html) => {
				if (err) return console.log(err);
				res.writeHeader(200, {
					"Content-Type": "text/html"
				});
				res.write(html);
				res.end();
			});
		},
		"POST": (req, res) => {

		}
	};

module.exports = {
	login: (req, res,next) => {
		console.log('in the login');
		const method = req.method,
			run = rLogin[method];
		if (!run) {
			return console.log('method no defind!');
		}
		run(req, res);
	},
	home: (req, res, next) => {
		console.log('in the home');
		const method = req.method,
			run = rHome[method];
		if (!run) {
			return console.log('method no defind!');
		}
		run(req, res);
	}
}
8 回复

@i5ting 还是不行,这样"/"改如何访问。

我只是想"/“只能匹配到”/","/home"只能匹配到"/home",然后"/hdgkah"这种未设置的路由不会被"/"匹配到。

… 为何你要用connect而不是expresskoa, 看了一下, connect似乎没有路由概念, 只有middleware
我估计大概要这样

app.use('/',  function(req, res, next) {
  // 判断是不是你想要handle的路径
  // 对connect不熟, 下面这个判断可能不够强, 仅供参考
  if(req.path != '/') {
    // 这个中间件放顶部, 交给下个中间件
    next();
  }else {
    route.login(req, res, next);
  }
});

@William17 想写点小东西,不想用Express框架,path判断我也想过…感觉不太优雅,刚接触node,不晓得啊。还有帮我看看body-parser 解析的req.query为什么老是undefined,谢了哈。

@William17 body-parser是不是没办法处理get请求的啊?

@kinglisky 如果你不想用别人封装好, 你只能自己封装优雅的接口 body-parser从名称知道它是parse body的, 你要用 query, 你要自己写个或者找个别人的 query parser, connect官方里写着这个qs

@William17 没心情了,搞Express去~~~~~~~

回到顶部