如何组织快递中间件更好?

时间:2016-02-08 19:28:53

标签: javascript node.js express middleware

我使用带有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'));

我的问题是,是否有更好的方式来写它? 我的意思是将功能逻辑分离到其他文件并需要它吗?

2 个答案:

答案 0 :(得分:4)

我建议创建文件'{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”文件夹时 - 它已经存在。

答案 1 :(得分:1)

这种扩展Danila Shutov's answer。我还建议您学会使用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()的多文件解决方案。没有一个路由器实际上必须知道彼此甚至是在同一个文件中。此外,您可以将路由器绑定到您想要的任何路径,然后切换它,而无需在整个项目中进行查找/替换。

例如,如果我们实际上不希望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"));