最好不要使用它!我解释,这也是我所做的解释。
next () 函数可以具有任何名称并且按照约定已设置为 next。它与通常在相同 URI 资源上执行的操作(PUT、GET、DELETE、...)间接相关,例如/ user /: id
app.get('/user/:id', function (req,res,next)...)
app.put('/user/:id', function (req,res,next)...)
app.delete('/user/:id', function (req,res,next)...)
app.post('/user/', function ()...)
现在,如果您查看 app.get、app.put 和 app.delete 使用相同的 uri (/user/:id),唯一区别它们的是它们的实现。当发出请求 (req) express 将 req 首先放在 app.get 中,如果您创建的任何验证因为该请求不是针对该控制器而失败,它会将 req 传递给 app.put,这是 te 文件中的下一个路由,所以上。如下例所示。
app.get('/user/:id', function (req,res,next){
if(req.method === 'GET')
//whatever you are going to do
else
return next() //it passes the request to app.put
//Where would GET response 404 go, here? or in the next one.
// Will the GET answer be handled by a PUT? Something is wrong here.
})
app.put('/user/:id', function (req,res,next){
if(req.method === 'PUT')
//whatever you are going to do
else
return next()
})
问题在于,最终您最终将 req 传递给所有控制器,希望通过验证 req 有一个控制器可以满足您的要求。最后,所有控制器最终都会收到不适合他们的东西:(。
那么,如何避免 next() 的问题呢?
答案很简单。
1-应该只有一个uri来识别资源
http://IpServidor/colection/:resource/colection/:resource如果你的 URI 比那个长,你应该考虑创建一个新的 uri
示例http://IpServidor/users/pepe/contacts/contacto1
2-对该资源的所有操作都必须尊重动词http(get,post,put,delete,...)的幂等性,因此对URI的调用实际上只有一种调用方式
POST http://IpServidor/users/ //create a pepe user
GET http://IpServidor/users/pepe //user pepe returns
PUT http://IpServidor/users/pepe //update the user pepe
DELETE http://IpServidor/users/pepe //remove the user pepe
更多信息 [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources][1]
让我们看看代码!让我们避免使用 next() 的具体实现!
在文件 index.js
//index.js the entry point to the application also caller app.js
const express = require('express');
const app = express();
const usersRoute = require('./src/route/usersRoute.js');
app.use('/users', usersRoute );
在文件 usersRoute.js
//usersRoute.js
const express = require('express');
const router = express.Router();
const getUsersController = require('../Controllers/getUsersController.js');
const deleteUsersController = require('../Controllers/deleteUsersController.js');
router.use('/:name', function (req, res) //The path is in /users/:name
{
switch (req.method)
{
case 'DELETE':
deleteUsersController(req, res);
break;
case 'PUT':
// call to putUsersController(req, res);
break;
case 'GET':
getUsersController(req, res);
break;
default:
res.status(400).send('Bad request');
} });
router.post('/',function (req,res) //The path is in /users/
{
postUsersController(req, res);
});
module.exports = router;
现在 usersRoute.js 文件完成了一个名为 usersRoute 的文件的预期工作,即管理 URI /users/ 的路由
//文件getUsersController.js
//getUsersController.js
const findUser= require('../Aplication/findUser.js');
const usersRepository = require('../Infraestructure/usersRepository.js');
const getUsersController = async function (req, res)
{
try{
const userName = req.params.name;
//...
res.status(200).send(user.propertys())
}catch(findUserError){
res.status(findUserError.code).send(findUserError.message)
}
}
module.exports = getUsersController;
通过这种方式,您可以避免使用 next,解耦代码,获得性能,开发 SOLID,为可能迁移到微服务敞开大门,最重要的是,它易于程序员阅读。