[英]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.js和createdata.js ):
const TestRouter = require("./TestRouter.js");
TestRouter.get("/:id", async (req, res) => {
// ...
});
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.js和createdata.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.js
和getdata.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.