当前位置: 首页 > 知识库问答 >
问题:

在N个ode.js模块中设置文件完成前的模块导出(导入/导出语法)

秦建元
2023-03-14

我正在使用express创建一个API,我希望每个endpoint都有一个文件。理想情况下,我希望在它的文件中创建路由器,将其导出,然后导入endpoint文件以运行它们。endpoint文件将再次导入路由器,然后使用。获取,或。post或任何在路由器上创建实际endpoint的操作。

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

我以前在一个项目中使用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");

然后在endpoint(getdata.js和createdata.js):

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

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

测试路由器。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";

endpoint(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语句时设置导出,或者有一种简单的方法(endpoint文件中大约有1-2行)让endpoint在调用之前等待TestRouter的实际设置。获取。在上面张贴或其他内容。

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

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

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

共有1个答案

林冥夜
2023-03-14

您可以通过将TestRouter.js分成两个部分来解决这个问题:

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

...让第二部分成为你的切入点。这打破了TestRouter.jsgetdata.js/createdata.js之间的循环,导致后者尝试访问从TestR<--plhd--3/导出的绑定>在它被初始化之前。

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保持不变。

 类似资料:
  • 关于在ES6中使用导入导出,我得到以下错误: SyntaxError:导出声明只能出现在顶层 我上网找办法解决这个问题,但我做不到。谁能解释一下。我是ES6的新手,特别是导入和导出。(我使用StealJS完全是为了这种东西)谢谢! js文件有: 应用程序JS functions.js

  • 本文向大家介绍详解JS模块导入导出,包括了详解JS模块导入导出的使用技巧和注意事项,需要的朋友参考一下 开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。 当然,上面提到有模块的概念,也是在JS用于服务器端编程的时候才会出现,我们在使用前端框架时,使用npm run dev,不就是启动了一个nod

  • 问题内容: react.js的新功能并尝试遵循本教程。不幸的是,页面中给出的代码无法正常工作。webpack抱怨 想知道如何解决它。谢谢。 === App.jsx ==== === main.js === 更新1 我注释掉了所有内容,并在末尾添加了以下内容 现在没有编译错误,但是网页为空白。我不确定这里出什么问题了。 问题答案: 您只能声明一个默认出口,例如: 要么 然后做 如果要导出更多内容,则

  • 模块“Transformer”解析为非模块实体,不能使用此构造导入。 如何导入类?其实我只是想利用那堂课。我不希望指令在我的代码中产生附带效应。我只想用它:'(

  • 数据的导入、导出任务一旦成功建立,结果将以邮件的形式发送到创建任务的用户邮箱里。 数据导出 接口 POST https://cloud.minapp.com/userve/v1/table/:table_id/export/ 其中 table_id 是数据表的 ID 请求参数 参数 类型 必填 说明 file_type String 是 导出文件的格式,支持 csv、json 格式 mode St

  • 数据的导入、导出任务一旦成功建立,结果将以邮件的形式发送到创建任务的用户邮箱里。 数据导出 接口 POST https://cloud.minapp.com/oserve/v1/table/:table_id/export/ 其中 table_id 是数据表的 ID 请求参数 参数 类型 必填 说明 file_type String 是 导出文件的格式,支持 csv、json 格式 mode St

  • 本文向大家介绍详解AngularJS中module模块的导入导出,包括了详解AngularJS中module模块的导入导出的使用技巧和注意事项,需要的朋友参考一下 AngularJS是一款来自Google的前端JS框架,它的核心特性有:MVC、双向数据绑定、指令和语义化标签、模块化工具、依赖注入、HTML模板,以及对常用工具的封装,例如$http、$cookies、$location等。 关于An

  • 我试图上传一个图像到内存使用multer,然后处理它与夏普和保存到磁盘。当我尝试在我的中间件中做多个module.exports时。 错误是: TypeError FileUpload.Single不是函数 到目前为止的路线是: 当我刚刚有下面的路由之前,尝试添加图像处理,我没有得到一个错误;