最好不要使用它!我会解释,这也是我所做的解释。
可以具有任何名称并按照约定的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;
这样,您就可以避免使用下一个代码,解耦代码,提高性能,开发SOLID,为可能迁移到微服务打开大门,并且最重要的是,程序员易于阅读。
res.redirect('/')
vsreturn res.redirect('/')
。也会有类似的情况吗?也许最好总是在res语句前编写return,以避免在发送标头后设置标头的错误?