我正在創建一個 API express,我想為每個端點創建一個檔案。理想情況下,我想在它的檔案中創建路由器,將其匯出,然后匯入端點檔案,以便它們運行。端點檔案將再次匯入路由器,然后使用.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(等)呼叫中指定所有中間件,我真的不想塞進由于可讀性,路由器檔案。
uj5u.com熱心網友回復:
你可以通過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保持不變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386315.html
標籤:javascript 节点.js 表达
