如何更好地组织 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"));
我正在使用带有 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' 文件夹存在于文件系统中时 - 它已经存在了。
这种扩展 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"));