簡體   English   中英

node.js快速遞歸路由失敗(404)

[英]nodejs express recursive routing fails (404)

我啟動了一個新的節點項目,並希望動態添加路由。 我之前已經做過,但是深度從未超過一層文件夾。 為此,我想出了一個遞歸函數來添加通過可能的子文件夾進行遍歷的路徑。 該函數在我的app.js中調用。 項目文件夾如下所示:

app.js
routes/
    index.js
    users.js
    api/
        foo.js
        test/
            bar.js

app.js中函數的定義和調用:

var express = require('express');
var fs = require('fs');
var path = require('path');
var app = express();

// Works
var routes = require('./routes/index');
app.use('/', routes);


// 404
getRoutes('routes');

function getRoutes(dir, cur) {
    if(cur === undefined) {
        cur = '/';
    }
    routes = fs.readdirSync(path.join(__dirname, dir));
    routes.forEach( function (file) {

        fs.stat(dir + "/" + file, function (err, stats) {
            if (err) {
                console.log(err);
            }
            else if (stats.isFile()) {
                var routeFilePath = "./" + path.join(dir, file);
                var route = path.join(cur, file.replace(/\.[^/.]+$/, ""))+'/';
                if(file == 'index.js') {
                    route = cur;
                }
                console.log(route, "defined in:", routeFilePath);

                var routeFile = require(routeFilePath);
                app.use(route, routeFile);
            }
            else if (stats.isDirectory()) {
                getRoutes(path.join(dir, file), path.join(cur, file));
            }
        });
    });
}

請注意,直接調用app.use()起作用。 有人看到錯誤了嗎?

console.log(route, "defined in:", routeFilePath);

/ defined in: ./routes/index.js
/users/ defined in: ./routes/users.js
/api/foo/ defined in: ./routes/api/foo.js
/api/test/bar/ defined in: ./routes/api/test/bar.js

對我來說看起來很正確。

問題是fs.stats()是異步的。 路由必須同步定義,例如:

function getRoutes(dir, cur) {
    if(cur === undefined) {
        cur = '/';
    }
    routes = fs.readdirSync(path.join(__dirname, dir));
    routes.forEach( function (file) {

        var stats = fs.statSync(dir + "/" + file);
        if (stats.isFile()) {
            var routeFilePath = "./" + path.join(dir, file);
            var route = path.join(cur, file.replace(/\.[^/.]+$/, ""))+'/';
            if(file == 'index.js') {
                route = cur;
            }
            console.log(route, "defined in:", routeFilePath);

            var routeFile = require(routeFilePath.replace(/\.[^/.]+$/, ""));
            console.log(routeFile);
            app.use(route, routeFile);
        }
        else if (stats.isDirectory()) {
            getRoutes(path.join(dir, file), path.join(cur, file));
        }

    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM