注意 - 我是新手试图用express编写我的第一个应用程序。 我按照视频教程,没有按照任何电子书或文档教程学习。因此,现在通过阅读电子书很难找到我所缺少的东西。
我有以下文件 -
app.js
/src/routes/testRoutes.js
/src/controllers/testController.js
以下是我的app.js文件 -
var express = require('express');
var app = express();
var port = 5000;
var testRouter = require('./src/routes/testRoutes');
app.use('/Test',testRouter);
app.get('/',function(req,res){
res.send("Hello world");
});
app.listen(port,function(err){
console.log("Running port on "+port);
});
testRoutes.js
var express = require('express');
var testRouter = express.Router();
var router = function()
{
var testController = require('../controllers/testController')(null);
testRouter.route('/hello').get(testController.hello);
return testRouter;
};
module.exports = router;
testController.js
//Will use revealing module pattern
var testController = function(botService)
{
var hello = function(req,res){
console.log("Inside bot controller");
};
return {
hello:hello
}
}
module.exports = testController;
如果我在运行http://localhost:5000/
后浏览node app
我可以看到Hello world
,但如果我浏览localhost:5000/Test
,它会无限期地旋转。
现在,我只想直接从控制器文件在浏览器上显示一些消息。
更新
通过对路由器文件testRoutes.js(删除该功能)进行以下修改,并向控制器添加res.send()
,我能够使其工作(停止旋转并显示消息) -
var express = require('express');
var testRouter = express.Router();
var testController = require('../controllers/testController');
testRouter.get('/world',testController.hello);
module.exports = testRouter;
但是,我仍然无法使用路径文件中的函数使其工作,该函数可以接受参数。我浏览了https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes和http://expressjs.com/en/guide/routing.html链接。
更新2
参考@ SatishPatel的答案,将控制器文件的内容更改为以下格式对我有用 -
function something()
{
return 5;
}
//Following works but above does not
module.exports = {
hello : function(req, res){
res.send('Get a book '+something())
},
getAllBooks : function(req, res){
res.send('Get all book');
}
}
但是,我想在使用揭示模块模式时使其工作,如上面的问题描述中所述。如果我在我的控制器中使用以下内容 -
//Will use revealing module pattern
var testController = function()
{
function something()
{
return 5;
}
var hello = function(req,res){
//console.log("Inside bot controller");
res.send("Hello world");
};
return {
hello:hello
}
}
module.exports = testController;
以下是npm start
-
D:\lab\nodejs_scraper\node_modules\express\lib\router\route.js:202
throw new Error(msg);
^
Error: Route.get() requires callback functions but got a [object Undefined]
at Route.(anonymous function) [as get] (D:\lab\nodejs_scraper\node_modules\express\lib\router\route.js:202:15)
at Object.<anonymous> (D:\lab\nodejs_scraper\src\routes\testRoutes.js:7:28)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (D:\lab\nodejs_scraper\app.js:6:18)
问题的可接受解决方案是解决这个问题的方法。
更新3
标记为已解决,因为在控制器中添加res.send()
后,旋转问题得到解决。
答案 0 :(得分:2)
您可以按如下方式分离您的控制器和路线:
<强> server.js 强>
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var port =5000;
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use('/',routes);
app.listen(port,function(err){
console.log("Running port on "+port);
});
<强> route.js 强>
var express = require('express');
var bookCtrl = require('../controllers/bookCtrl');
var router = express.Router();
router.route('/').get(function(req,res){
res.send('you are on root url');
});
router.route('/book').get(bookCtrl.getBook);
router.route('/allbooks').get(bookCtrl.getAllBooks);
/* Write all you apis here and control them in controller*/
module.exports = router;
<强> bookCtrl.js 强>
module.exports = {
getBook : function(req, res){
res.send('Get a book')
},
getAllBooks : function(req, res){
res.send('Get all book');
}
}