NodeJS Express需要和启动
我正在学习NodeJS和Express,然后我坚持要求工作。
我有主文件作为server.js和另一个testing文件作为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中创build快速应用程序,而肯定是从express.Router()引用路由器?
当我试图用mongoose创build一个CRUD时,这会变得更加混乱。 为什么我必须在testing路由器文件中引用mongoose模块和模式,但不必像在主server.js文件中那样build立连接。
到目前为止,我已经理解了这个require对于我使用的模块来说实际上是本地的,这实际上是有意义的,因为每次我需要在其他模块中引用依赖模块。 但是我不必在路由文件中重新build立连接,也不必在路由文件中侦听某个端口,在路由文件中使用body-parser(当我使用它的时候)。
任何指针都会有所帮助。 提前致谢。
require()
加载一个代码模块,并返回模块内分配给module.exports
任何内容。 一般来说,模块应该写成使得加载它们实际上不会创build任何东西,而只是在导出中返回一些东西,使得调用者可以对模块进行操作。 也就是说,快递模块的function。
在express
模块的情况下,它返回一个构造函数,可以调用它来创build一个快速的应用程序,就像在server.js
app = express()
中的server.js
。 你在routes/test.js
中没有这样做,所以你不在那里创build另一个快速应用程序。
请注意,因为函数是Javascript中的对象,所以express模块返回的构造函数也可以具有自己的属性,例如您在routes/test.js
中使用的express.Router
属性。
至于你的mongoose问题,我不太关注你在那里问的问题。 如果您向我们显示特定的代码,我们可能会进一步评论这个问题。
路由文件中的方法传递由Express创build的req
和res
参数,作为处理传入的HTTP请求的一部分。 这些方法位于哪个文件并不重要.Express的工作方式是将传入的http连接传递到各个Express中间件步骤,然后转换为request
和response
对象,然后传递给路由器以找出哪些具体的处理程序应该处理该特定的请求。
如果您在Express(或任何其他中间件function)中使用body-parser
或cookie-parser
中间件,那么这些中间件步骤将在请求传递到任何路由器之前执行。 如果这些中间件步骤所做的是在request
对象上创build属性(这是常见的方法),那么这些数据将位于传递给您的路由处理程序的request
对象上。 除了注册路由处理程序之外,您不必为在路由模块中发生的事情做任何特殊的事情。 Express和它的中间件就是这样工作的。