express的路由问题?
发布于 9 年前 作者 QuoniamYIF 4740 次浏览 最后一次编辑是 8 年前 来自 问答

文件结构 ├── app.js ├── bin ├── LICENSE ├── npm-debug.log ├── package.json ├── README.md ├── router │   └── index.js ├── router-action | └── index.js └── views | |___index.js

为什么以注释内的文件可以运行成功,router.get('/', routerAction.index);这样就不成功呢? router/index.js文件

var express = require('express'),
	router = express.Router(),
	routerAction = require('../router-action');

router.get('/', routerAction.index);
// router.get('/', function(req, res){
// 	res.render('index', {title: 'Microblog-express'});
// });

app.js文件

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var router = require('./router');
......
app.use('/', router);

router-action/index.js文件

exports.index = function(req, res){
	res.render('index', { title: 'Microblog-express' });
}
13 回复
var router = require('./router');
......
app.use('/', router);

check this code segment

@MiguelValentine 这之间也没发现什么问题?

var router = require('./router');
// var routes = require('./routes/index');
// var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', router);
app.use('/', router);

你想说下面这就是route.js么。

var express = require('express'),
    router = express.Router(),
    routerAction = require('../router-action');

router.get('/', routerAction.index);
// router.get('/', function(req, res){
//  res.render('index', {title: 'Microblog-express'});
// });

如果是,改成app.use(router);

@MiguelValentine 是router/index.js文件,为什么这样改?我就是想把路由分离到router/index.js文件下,把每个路由的回调函数封装起来,分离到router-action/index.js文件下,如果我不分离回调函数的话,程序是可以运行的,分离之后不知道为什么,调用不了routerAction.index,成GET / - - ms - -

@QuoniamYIF 统一用route管理你的路由。用app管理中间件。

app.use('/', router);  -> app.use(router);

顺便你可以加一句moudle.exports = exports在routerAction最后。 反正你先试试,我看你的代码只有这里有坑。

楼主,你的文件夹究竟是叫 router_action 还是 router-action 难道没有提示 require 失败?

@klesh router-action,已更正

@QuoniamYIF 那现在问题解决了吗?还是不能正常响应?

@klesh 还没,没找到问题在哪,正在看express研究

@QuoniamYIF 你说运行不成功具体是有什么出错信息吗?我照你的意思试了一下,是没有问题的,可以正常输出的。只是把 function 放到另外一个 js 文件是不影响。

$ express test
$ cd test
$ npm install
$ vim routes/index.js
$ mkdir router-action
$ vim router-action/index.js
$ npm start

routes/index.js

var express = require('express');
var router = express.Router();
var routerAction = require('../router-action');

/* GET home page. */
//router.get('/', function(req, res, next) {
  //res.render('index', { title: 'Express' });
//});

router.get('/', routerAction.index);

module.exports = router;

router-action/index.js

exports.index = function(req, res) {
  res.render('index', { title: 'Microblog-express' });
};

你的意思是下面的代码能正常运行:

router.get('/', function(req, res){
  res.render('index', {title: 'Microblog-express'});
});

而这样不能正常运行:

router.get('/', routerAction.index);

尝试打印出routerAction.index看看是什么内容,比如:

router.get('/', routerAction.index);
console.log(routerAction.index.toString());

@klesh 找到问题了,我router-action/index.js是这样的,所以成空函数了,太粗心了

exports.index = function(req, res){
	res.render('index', { title: 'Microblog-express' });
}
......

 exports.index = function(req, res){
	// res.render('index', { title: 'Microblog-express' });
 }

@leizongmin 找到问题了,我router-action/index.js是这样的,所以成空函数了,太粗心了

exports.index = function(req, res){
	res.render('index', { title: 'Microblog-express' });
}
......

 exports.index = function(req, res){
	// res.render('index', { title: 'Microblog-express' });
 }
回到顶部