Node.js 初始化阶段的快速路由调用方法?

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

我有一个基本的express应用程序,其中app.ts看起来像

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
            }
        }
    })