我目前使用此腳本加載我的 API 端點:
readdirSync('./routes/api').map((r) =>
app.use(
`/api/v1/${r.split('.')[0]}`,
require(`./routes/api/${r.split('.')[0]}`)
)
);
它幾乎讀取routes/api檔案夾內的所有內容,我在 POSTMAN 中訪問端點的方式如下:
{{URL}}/api/v1/posts/123
{{URL}}/api/v1/videos/123
{{URL}}/api/v1/users/123
and so on
現在我想做的是創建將用作工具的端點,比如說,一個視頻轉換器端點?
此外,我想將此端點放在extras路由檔案夾內的檔案夾中,如下圖所示:

呼叫extras檔案夾內端點的方法如下所示:
{{URL}}/api/v1/extras/posts/123
{{URL}}/api/v1/extras/videos/123
{{URL}}/api/v1/extras/users/123
and so on
然后我決定用第二個新腳本運行我的服務器,看看它是否可以運行......
readdirSync('./routes/api/extras').map((r) =>
app.use(
`/api/v1/extras/${r.split('.')[0]}`,
require(`./routes/api/extras/${r.split('.')[0]}`)
)
);
好吧,它沒有。我收到了一個錯誤:
[0] Error: Cannot find module './routes/api/extras'
[0] Require stack:
[0] - C:\xampp\htdocs\befree\server.js
[0] at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
[0] at Function.Module._load (internal/modules/cjs/loader.js:746:27)
[0] at Module.require (internal/modules/cjs/loader.js:974:19)
[0] at require (internal/modules/cjs/helpers.js:93:18)
[0] at C:\xampp\htdocs\befree\server.js:165:5
[0] at Array.map (<anonymous>)
[0] at Object.<anonymous> (C:\xampp\htdocs\befree\server.js:162:29)
[0] at Module._compile (internal/modules/cjs/loader.js:1085:14)
[0] at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
[0] at Module.load (internal/modules/cjs/loader.js:950:32) {
[0] code: 'MODULE_NOT_FOUND',
[0] requireStack: [ 'C:\\xampp\\htdocs\\befree\\server.js' ]
[0] }
[0] Error Cannot find module './routes/api/extras'
[0] Require stack:
[0] - C:\xampp\htdocs\befree\server.js
[0] [nodemon] app crashed - waiting for file changes before starting...
有誰知道是否有辦法解決這個問題?
uj5u.com熱心網友回復:
fs.readdir將讀取提供的目錄中的所有檔案,即檔案和目錄。這意味著在執行時readdirSync('./routes/api'),目錄名稱extras也將傳遞到require您的.map回呼內部,并且由于它是一個目錄,因此將完成以下操作(來自docs):
[...]如果傳遞給 require 的檔案名實際上是一個目錄,它會首先在目錄中查找 package.json 并加載 main 屬性中參考的檔案。否則,它將尋找一個 index.js。
在您的情況下,似乎都沒有找到上述情況,因此您會收到錯誤訊息 Cannot find module './routes/api/extras'
一種可能的解決方案是過濾目錄并僅處理檔案,例如:
readdirSync('./routes/api')
.filter(r => fs.lstatSync('./routes/api/' r).isFile())
.map((r) =>
app.use(
`/api/v1/${r.split('.')[0]}`,
require(`./routes/api/${r.split('.')[0]}`)
)
);
uj5u.com熱心網友回復:
我無法按照自己的意愿創建路線
/api/v1/extras/youtube
and so on
但是,我能夠通過創建一個遍歷每個檔案夾的函式來消除之前顯示的錯誤。
// Define routes
const dir = './routes/api';
function getFiles(dir) {
return fs.readdirSync(dir).flatMap((item) => {
// const file = item.split('.')[0];
const routePath = `${dir}/${item}`;
if (fs.statSync(routePath).isDirectory()) {
return getFiles(routePath);
}
// return { singlefile: file, directories: routePath };
return { item, routePath };
});
}
const routes = getFiles(dir);
routes.map((result) => {
app.use(
`/api/v1/${result.item.split('.')[0]}`,
require(`.${result.routePath.split('.')[1]}`)
);
});
我的 youtube 路線位于routes>api>extras>youtube.js但我仍然需要這樣稱呼它:
/api/v1/youtube
我想說的已經足夠好了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333150.html
標籤:javascript 节点.js 表达 猫鼬 端点
