我正在学习 NodeJS 和 Express,然后我就陷入了 require 的工作原理。
我的主文件为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 模块和架构,但不必像在主 server.js 文件中那样建立连接。
到目前为止,我已经了解了 require 实际上是我正在使用的模块本地的事实,这实际上是有道理的,因为每次我在其他模块中需要依赖模块时,我都必须引用它们。但我不必在路由文件中再次建立连接,不必监听路由文件中的某个端口,在路由文件中使用 body-parser (当我使用它时)。
任何指示都会有所帮助。提前致谢。
最佳答案
require()
加载代码模块并返回分配给模块内 module.exports
的任何内容。一般来说,应该编写模块,以便加载它们实际上不会创建任何内容,而只是在导出中返回允许调用者对模块执行操作的内容。这确实是express 模块的作用。
对于 express
模块,它返回一个构造函数,可以调用该构造函数来创建 Express 应用程序,就像您在 server.js
中使用 app = express()
所做的那样。您没有在 routes/test.js
中执行此操作,因此您不会在那里创建另一个快速应用程序。
请注意,由于函数是 Javascript 中的对象,因此 Express 模块返回的构造函数也可以拥有自己的属性,例如您在 routes/test.js
中使用的 express.Router
属性。
至于你的 Mongoose 问题,我不太明白你在那里问的问题。如果您向我们展示该特定代码,我们可能会进一步评论该问题。
路由文件中的方法将传递 req
和 res
参数,这些参数是由 Express 创建的,作为处理传入 HTTP 请求的一部分。这些方法位于哪个文件中并不重要。Express 的工作方式是传入的 http 连接通过各个 Express 中间件步骤传递,并转换为 request
和 response
对象,然后将它们传递到路由器以确定哪些特定处理程序应处理该特定请求。
如果您在 Express 中使用 body-parser
或 cookie-parser
中间件(或任何其他中间件功能),那么在请求传递到任何路由器之前,这些中间件步骤将已经执行。如果这些中间件步骤的作用是在 request
对象上创建属性(这是一种常见方法),那么该数据将位于传递给路由处理程序的 request
对象上。除了注册路由处理程序之外,您无需在路由模块中执行任何特殊操作。这就是 Express 及其中间件的工作原理。
关于javascript - NodeJS Express 要求和启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27005764/