我正在从各种教程中学习快速,并且有一个在本地工作的应用程序,但我想更好地理解代码的每个部分的作用。
我对app.route()
部分中的示例感到有点难过:
https://expressjs.com/en/guide/routing.html
app.route('/book')
.get(function (req, res) {
res.send('Get a random book')
})
.post(function (req, res) {
res.send('Add a book')
})
.put(function (req, res) {
res.send('Update the book')
})
我可以看到app
等于express()
,这是一个记录为here的顶级函数。
我可以看到.get()
,post()
和put()
方法被链接到route()
方法,该方法记录为here。
我感到困惑的是,文档声明.get()
,post()
和put()
方法的参数采用以下格式:
app.get(path, callback [, callback ...])
app.post(path, callback [, callback ...])
app.put(path, callback [, callback ...])
为什么链式.get()
,post()
和put()
方法不需要path
参数,而是使用单数函数作为返回{的值的参数{3}}(又名req
)和Request(又名res
)对象参数?
我显然遗漏了一些简单的东西,所以指向文档的指针可以帮助我更好地理解直接从app
调用这些方法之间的区别,例如app.get()
和route()
,例如app.route('/book').get()
将非常感激。
编辑:基本上,我想知道是否有文档定义了.get()
,post()
和put()
方法所需的参数格式从调用app.route("/book")
返回的路由对象调用时,因为它似乎不是所记录的内容,即path, callback [, callback ...]
。
答案 0 :(得分:1)
链式方法的意义在于它们具有相同的路径。
所以你可以这样写:
app.route('/book')
.get(function (req, res) {
res.send('Get a random book')
})
.post(function (req, res) {
res.send('Add a book')
})
.put(function (req, res) {
res.send('Update the book')
})
而不是
app.get('/book', function (req, res) {
res.send('Get a random book')
});
app.post('/book', function (req, res) {
res.send('Add a book')
});
app.put('/book', function (req, res) {
res.send('Update the book')
});
这意味着如果你改变了端点,那么所有方法都会改变它,你就不能在一种方法中写错误...
答案 1 :(得分:1)
<强> app.route()强>
根据文档,app.route
方法:
返回单个路由的实例,然后可以使用该实例处理带有可选中间件的HTTP谓词。使用app.route()可以避免重复的路由名称(从而避免拼写错误)。
这意味着,app.route()
只接受路径并返回route object
。哪个http动词方法可以处理针对一条路径的中间件,get
,post
,delete
,post
,put
,patch
等
<强>为什么吗
简单地拥有路径相同但HTTP请求不同的路由。喜欢:
app.route('/books')
.get() // To get the list of objects
.post() // To save a new book.
个别HTTP方法
另一方面,express在app
上提供了用于处理HTTP请求的单独方法。与app.get()
,app.post()
,app.delete()
一样。
根据post route的文档:HTTP POST使用指定的回调函数向指定路径发出请求。
<强>为什么吗
对于您没有多条HTTP请求的路径的情况。让我们说:
app.delete('/books/:bookId/comments/:commentId', function(){});
上述路线是一种单一路线,仅用于删除书籍上的特定评论。
我希望我能够清除差异。
修改强>
由于路径对象提供的列表方法没有合适的文档: 有关更多信息,请将github链接添加到快速路由器。
https://github.com/expressjs/express/blob/master/lib/router/route.js
以下是Express的路由器代码,它为所有方法添加处理程序。
methods.forEach(function(method){
Route.prototype[method] = function(){
var handles = flatten(slice.call(arguments));
for (var i = 0; i < handles.length; i++) {
var handle = handles[i];
if (typeof handle !== 'function') {
var type = toString.call(handle);
var msg = 'Route.' + method + '() requires a callback function but got a ' + type
throw new Error(msg);
}
debug('%s %o', method, this.path)
var layer = Layer('/', {}, handle);
layer.method = method;
this.methods[method] = true;
this.stack.push(layer);
}
return this;
};
});
在顶部的这个文件中,它有:
var methods = require('methods');
因此,链式方法所需的参数为unlimited functions
作为请求handlers/middlewares
。