繁体   English   中英

在 Node.js 模块中的文件完成之前设置模块导出(`import`/`export` 语法)

[英]Set a module export before the file finishes in Node.js module (`import`/`export` syntax)

我正在使用express创建一个 API,我想为每个端点创建一个文件。 理想情况下,我想在它的文件中创建路由器,将其导出,然后导入端点文件以便它们运行。 端点文件将再次导入路由器,然后使用.get.post或其他任何东西在路由器上创建实际端点。

所以基本上,我的目标是让一个文件运行另一个文件,该文件使用第一个文件导出的值,然后再运行不同的文件。

我以前在使用require()语法的项目中完成了此操作,但现在我试图将其转换为不同项目的import / export语法。

以前,我(成功地)在另一个项目中使用过这样的东西:

路由器.js

const express = require("express");

// Create and export a new router
const TestRouter = express.Router();
module.exports = TestRouter;

// Make the endpoints register themselves
require("./getdata.js");
require("./createdata.js");

然后在端点( getdata.jscreatedata.js ):

const TestRouter = require("./TestRouter.js");

TestRouter.get("/:id", async (req, res) => {
  // ...
});

现在,我正在尝试对 package 语法( import / export )做同样的事情:

测试路由器.js

import { Router } from "express";

// Create and export our new router
const TestRouter = Router();
export default TestRouter;

// Import endpoints so they can register themselves
import "./getdata.js";
import "./createdata.js";

端点( getdata.jscreatedata.js ):

import TestRouter from "./TestRouter.js";

TestRouter.get("/:id", async (req, res) => {
  // ...
});

但是这种直接翻译是行不通的。

当我现在尝试运行这个项目时,我收到如下错误:

file:///.../src/routes/getdata.js:3
TestRouter.get("/:id", async (req, res) => {
^

ReferenceError: Cannot access 'SessionRouter' before initialization
    at file:///.../src/routes/getdata.js:3:1
    ...

目前我最有可能对这个问题的猜测是,模块中的导出实际上并不是在export语句时设置的,而是在它们各自的文件在处理完其他所有内容后到达末尾时设置的。

所以我的问题是是否有办法在export语句时设置导出,或者可能是一种简单的方法(端点文件中大约 1-2 行)让端点等待TestRouter实际设置在调用.get.post或其他任何内容之前。

我知道我可以让端点文件只导出实际的端点处理程序:

const getdata = async (req, res) => {
  // ...
}
export default getdata;

然后在路由器文件中调用.get

import { Router } from "express";

// Import endpoint handlers
import getdata from "./getdata.js";

// Create our new router
const TestRouter = Router();

// Register endpints
TestRouter.get("/:id", getdata);

但我想避免这种情况——如果可能的话——因为每个端点都需要不同的中间件配置,这意味着我必须在TestRouter.get (等)调用中指定所有中间件,而我真的不想这样做由于可读性,塞进路由器文件。

您可以通过将TestRouter.js拆分为两部分来解决此问题:

  • 创建路由器的部分(让我们把它留在TestRouter.js中)
  • 加载端点的部分(我们称之为main.js

...并将第二部分作为您的切入点。 这打破了TestRouter.jsgetdata.js / createdata.js之间的循环,导致后者在初始化之前尝试从TestRouter.js访问导出的绑定。

main.js

// Create and export our new router
import TestRouter from "./TestRouter.js";
// Or, actually, just: import "./TestRouter.js";

// Import endpoints so they can register themselves
import "./getdata.js";
import "./createdata.js";

TestRouter.js

import { Router } from "express";

// Create and export our new router
const TestRouter = Router();
export default TestRouter;

getdata.js / createdata.js保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM