我正在学习NodeJS和Express,然后我被困在需要工作的地方。
我的主文件为 server.js ,另一个测试文件为 test.js 。
[server.js]
var express=require('express');
//Include Routes
var rTest=require('./routes/test');
//Express Application COnfiguration
var app=express();
var port=process.env.PORT||3000;
var router=express.Router();
//Index
router.get('/',function(req,res){
res.json({message:'Welcome to Index!'});
});
app.use('/api/t',rTest); //Test
app.listen(port);
[routes / test.js]
var express=require('express');
var router=express.Router();
router.route('/')
.get(function(req,res){
res.send('Now Test Running OK!');
});
module.exports=router;
代码按预期工作 - 转到 http://localhost:3000/api/t
打印“Now ..”消息。所以我的问题是,为什么我不在test.js中再次创建Express应用程序,而我肯定是从express.Router()引用路由器?
当我尝试使用mongoose创建CRUD时,这会变得更加混乱。为什么我必须在测试路由器文件中引用mongoose模块和模式,但不必像在main server.js文件中那样建立连接。
到目前为止,我已经理解了require实际上是我正在使用的模块本地的事实,这实际上是有意义的,因为我必须在其他模块中每次需要它时引用依赖模块。但我不必在路由文件中再次建立连接,不必在路由文件中侦听某个端口,在路由文件中使用body-parser(当我使用它时)。
任何指针都会有所帮助。提前谢谢。
答案 0 :(得分:1)
require()
加载代码模块并返回分配给模块内module.exports
的内容。通常,应该编写模块,以便加载它们实际上不会创建任何内容,而只是返回导出中允许调用者对模块执行操作的内容。实际上,这就是快递模块所做的事情。
对于express
模块,它返回一个构造函数,可以调用它来创建一个快速应用程序,就像在server.js
中使用app = express()
一样。你没有在routes/test.js
中这样做,所以你不会在那里创建另一个快速申请。
注意,由于函数是Javascript中的对象,因此express模块返回的构造函数也可以拥有自己的属性,例如express.Router
中使用的routes/test.js
属性。
关于你的猫鼬问题,我不太关注你在那里问的问题。如果您向我们展示特定代码,我们可能会就此问题进一步发表评论。
路由文件中的方法传递req
和res
参数,这些参数由Express创建,作为处理传入HTTP请求的一部分。这些方法所在的文件无关紧要.Express的工作方式是传入的http连接通过各种Express中间件步骤传递到request
和response
对象,然后传递给它们下到路由器以确定哪些特定处理程序应该处理该特定请求。
如果您在Express(或任何其他中间件功能)中使用body-parser
或cookie-parser
中间件,那么在请求传递到任何路由器之前,这些中间件步骤已经执行。如果这些中间件步骤所做的是在request
对象上创建属性(这是一种常用方法),那么该数据将位于传递给路由处理程序的request
对象上。除了注册路由处理程序之外,您不必在路由模块中执行任何特殊操作。这就是Express及其中间件的工作方式。