如何更好地组织 express 中间件?

How to organize express middlewares better?

我正在使用带有 express 的节点,以下代码按预期工作。

文件app.js

app.use(function (req, res, next) {
    fs.mkdir('uploads/', function (e) {
        if (!!e && e.code !== 'EEXIST') {
            console.log('Error while trying to create upload folder: ' + err);
        }
        next();
    });
}, upload.single('file'));

请问有没有更好的写法? 我的意思是将功能逻辑分离到其他文件并要求它?

我建议创建文件 '{project_root}/middlewares/fsUtils.js':

function createFolderIfNotExists(folder) {
    return function (req, res, next) {
        fs.mkdir(folder, function (e) {
            if (!!e && e.code !== 'EEXIST') {
                console.log('Error while trying to create upload folder: ' + err);
            }
            next();
        });
    };
}

module.exports = {
    createFolderIfNotExists: createFolderIfNotExists
};

然后你可以像这样使用它:

var fsUtils = require('./middlewares/fsUtils');

app.use(fsUtils.createFolderIfNotExists('/uploads'), upload.single('file'));

虽然不是理想的方法。最好在应用程序启动时将初始化逻辑移动到单独的脚本和 运行 它,这样当您期望 'uploads' 文件夹存在于文件系统中时 - 它已经存在了。

这种扩展 . I would also suggest that you learn to use express.Router()。这些可以通过将子路由重构为单个文件来帮助您更好地组织路由。


只需使用 require

考虑下面的单个文件,您在其中定义所有路由,但使用 require 导入单个处理程序。它稍微清理了一下,但您仍然会在单个文件中定义大量路由。如果您更改这些路线的路径,也会很麻烦。

index.js

app.use("/", require("./root-route"));
app.use("/users", require("./users-route"));
app.use("/users/create", require("./users-create-route"));
app.use("/users/delete", require("./users-delete-route"));
app.use("/comments", require("./comments-route"));
app.use("/comments/create", require("./comments-create-route"));
app.use("/comments/delete", require("./comments-delete-route"));

使用express.Router()

现在考虑这个使用 express.Router() 的多文件解决方案。 None 的路由器实际上必须相互了解,甚至在同一个文件中。此外,您可以将路由器绑定到您想要的任何路径,然后切换它,而无需对整个项目执行 find/replace。

例如,如果我们实际上不希望 users 成为任何逻辑 ./users-route 的路径,我们可以将其安装在 players 并且它会自动运行。

users.js

var usersRoute = require("express").Router();

usersRoute.use("/", require("./users-route"));
usersRoute.use("/create", require("./users-create-route"));
usersRoute.use("/delete", require("./users-delete-route"));

module.exports = usersRoute;

comments.js

var commentsRoute = require("express").Router();

commentsRoute.use("/", require("./comments-route"));
commentsRoute.use("/create", require("./comments-create-route"));
commentsRoute.use("/delete", require("./comments-delete-route"));

module.exports = commentsRoute;

index.js

app.use("/", require("./root-route"));
app.use("/users", require("./users"));
app.use("/comments", require("./comments"));