Node.js 初始化阶段的快速路由调用方法?
我有一个基本的express应用程序,其中app.ts看起来像Node.js 初始化阶段的快速路由调用方法?,node.js,typescript,express,express-router,Node.js,Typescript,Express,Express Router,我有一个基本的express应用程序,其中app.ts看起来像 import * as express from "express"; const application: express.Application = express(); application.get("/", function( request: express.Request, response: express.Response ) { console.log(&q
import * as express from "express";
const application: express.Application = express();
application.get("/", function(
request: express.Request,
response: express.Response
) {
console.log("Inside Router ");
response.json({ "test": true});
});
application.listen(3000, function() {
console.log("sever ready");
});
在这种情况下,当路由被点击时,控制台消息“Inside Route”将在服务器控制台中打印
但是,
包装器
const methods = () => {
};
console.log("This is a testable offence");
export const wrapperMethod = {methods};
NPM命令:
nodemon ts-node ./src/index.ts
在这种情况下,在服务器启动时,我们可以观察到正在打印“这是可测试的违规行为”
但“Inside Route”(内部路线)信息仅在路线被击中时才会打印出来
有人能解释相同的原因吗?打印“内部路由器”的
控制台.log
位于一个回调中,只有在点击路由“/”时才会调用该回调。因此,在点击路线“/”时会打印消息
第二个console.log
位于wrapper.ts
模块的顶层,因此只有在加载wrapper.ts
时(在require('./wrapper')
)才会调用它,这仅在应用程序启动时发生
如果您想在每次调用wrapper.methods
时记录第二条消息,则需要将该console.log
放入wrapper.methods
简短回答:
TS基本上是javascript的超集,所以让我们从javascript的角度来讨论 在导入javascript时,它执行文件、评估脚本并缓存它
// module.ts
const app = "HELLO"
export {app}
在您的情况下,实际上已经执行了application.get
,但是只要用户点击特定路线,express就会执行回调函数,即函数(req,res)
// express.ts
import { Router } from "express"
const router = Router(); // creating express router
router.get("/", function (req, res) {
console.log("hit by ", req.ip)
res.send("PING")
})
export default router;
所以基本上,当您将文件导入到另一个文件中时,整个代码都将被执行
// server.ts
import router from "./express"
import express from "express"
// creating express application
const app = express();
// registering the route
app.use("/", router);
app.listen(3000)
启动服务器后的控制台
$ ts-node server.ts
在终端上运行命令
$ curl localhost:3000
PONG
命中api后的服务器终端将是
hit by ::1
如果您想查看应用程序中注册的所有路由,请在使用
require
后查看此问题,node.js将用此函数包装您的函数
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
您可以尝试在终端中键入node
,然后键入require(“模块”).wrapper
查看。所以,节点将把您的代码放在这个函数中,然后像下面的代码一样执行这个包装器函数
(function (exports, require, module, __filename, __dirname) {
const methods = () => {
};
console.log("This is a testable offence");
module.exports = {
wrapperMethod: {
methods
}
}
})
注意:我将您的export
转换为CommonJS语法
节点执行此功能后,您可以访问外部文件中的wrapperMethod
,并且应该打印console.log
。
我们可以像下面的代码那样简化瘦函数
(function (exports, require, module, __filename, __dirname) {
const methods = () => {
};
console.log("This is a testable offence");
module.exports = {
wrapperMethod: {
methods
}
}
})
(函数(){
console.log(“这是可测试的罪行”);
})
如果执行此函数,它的输出是什么?这是
console.log
消息
因此,当您使用require
时,节点将使用包装函数执行文件的内容
这就是为什么当您的服务器启动时,它会显示这是一个可测试的违规行为
因为您require
使用require('./wrapper')创建包装文件代码>在索引文件的头部。似乎您想将其用作中间件(?)如果是这样,您必须在路由之前调用所有中间件。它不应该是导出常量方法代码>而不是导出常量方法=方法代码>@kmp我的问题是,在路由中,有一个控制台语句在服务器启动时打印,但是控制台消息在服务器启动时的wrapper.method中打印。我想了解这背后的原因。嗯,我试图重现这一点,但它对我来说正如预期的那样有效,也就是说,内部包装方法
仅在点击路由时才被调用。这真的是你所有的代码吗?是否有一个中间件也调用包装器?问题是,当您加载包装器时,它会加载整个文件,因此console.log()
会立即运行。将代码放入函数中,使其仅在调用时运行。在您的情况下,它只会在您点击“/”
路线时运行
(function (exports, require, module, __filename, __dirname) {
const methods = () => {
};
console.log("This is a testable offence");
module.exports = {
wrapperMethod: {
methods
}
}
})