>释放Express 4,创建RESTFUL API变得更加容易。如果要创建一个单页应用程序,则肯定需要一个支持CRUD操作的RESTFUL Web服务。我的最后一个教程重点是用Angular的$资源创建一个单页CRUD应用程序。本教程说明了如何使用Express 4来设计此CRUD应用的后端API
>请注意,自Express 3以来,已更改了很多。本教程并未解释如何将您的应用程序从Express 3升级到Express 4。相反,它将涵盖如何直接使用Express 4创建API。所以,让我们开始吧。>
钥匙要点目录结构
我们将在应用程序中使用以下目录结构:
bin/www.js用于引导我们的应用程序。
>模型目录存储我们的猫鼬模型。对于此应用程序,我们只有一个名为Movie.js的文件。
>
app.js保存我们的Express App的配置。>注意 - 身体偏远者不再是Express Core的一部分。您需要单独下载该模块。因此,我们已经在包装中列出了它。
要获取这些软件包,我们将它们列为package.json中的依赖项。这是我们的软件包。
<span>{ </span> <span>"name": "Movie CRUD API", </span> <span>"version": "0.0.1", </span> <span>"private": true, </span> <span>"scripts": { </span> <span>"start": "node ./bin/www" </span> <span>}, </span> <span>"main":"./bin/www", </span> <span>"engines": { </span> <span>"node": "0.10.x" </span> <span>}, </span> <span>"dependencies": { </span> <span>"express": "~4.2.0", </span> <span>"body-parser": "~1.0.0", </span> <span>"mongoose": "~3.8.11" </span> <span>} </span><span>}</span>
创建模型
>
<span>var mongoose=require('mongoose'); </span><span>var Schema=mongoose.<span>Schema</span>; </span> <span>var movieSchema = new Schema({ </span> <span>title: String, </span> <span>releaseYear: String, </span> <span>director: String, </span> <span>genre: String </span><span>}); </span> module<span>.exports = mongoose.model('Movie', movieSchema);</span>
>
创建路由Express 4具有一个名为Express.Router()的新方法,该方法为我们提供了一个新的路由器实例。它可用于定义中间和路线。关于快速路由器的有趣观点是它就像一个迷你应用程序一样。您可以使用此路由器来定义中间Wares和路线,然后像其他任何中间件一样在主应用中使用它。
获得所有电影<span>var Movie = require('../models/movie'); </span><span>var express = require('express'); </span><span>var router = express.<span>Router</span>();</span>
用户将get请求发送到 /api /电影时,我们应该向他们发送包含所有电影的响应。这是为此创建路线的片段。
创建新电影
router<span>.route('/movies').get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span><span>});</span>
这是代码:
>在这里,我们从请求主体创建了一个新的电影实例。这是使用身体较好者的地方。然后,我们只保存新电影并发送一个响应,表明操作成功。
>请注意,方法get(),post()等。返回相同的路由实例。因此,您实际上可以链接前两个电话,如下所示。
>router<span>.route('/movies').post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span><span>});</span>
更新电影
如果用户想更新电影,则需要将PUT请求发送到/api/Movie/:ID,并以JSON字符串作为请求主体。我们使用命名参数:ID访问现有电影。当我们使用MongoDB时,我们所有的电影都有一个唯一的标识符,称为_id。因此,我们只需要检索参数:ID并使用它来查找特定的电影。执行此操作的代码如下所示。
><span>{ </span> <span>"name": "Movie CRUD API", </span> <span>"version": "0.0.1", </span> <span>"private": true, </span> <span>"scripts": { </span> <span>"start": "node ./bin/www" </span> <span>}, </span> <span>"main":"./bin/www", </span> <span>"engines": { </span> <span>"node": "0.10.x" </span> <span>}, </span> <span>"dependencies": { </span> <span>"express": "~4.2.0", </span> <span>"body-parser": "~1.0.0", </span> <span>"mongoose": "~3.8.11" </span> <span>} </span><span>}</span>
>在这里,我们创建一个新的路由 /电影 /:ID并使用方法put()。 Movie.findone的调用({_id:req.params.id})用于查找在URL中传递的ID的电影。有了电影实例后,我们将根据请求正文中的JSON进行更新。最后,我们保存了这部电影并向客户发送回复。
要阅读一部电影,用户需要将get请求发送到路由/api/movies/:id。我们将使用与上述相同的路线,但是这次使用get()。
><span>var mongoose=require('mongoose'); </span><span>var Schema=mongoose.<span>Schema</span>; </span> <span>var movieSchema = new Schema({ </span> <span>title: String, </span> <span>releaseYear: String, </span> <span>director: String, </span> <span>genre: String </span><span>}); </span> module<span>.exports = mongoose.model('Movie', movieSchema);</span>
>代码的其余部分非常简单。我们根据传递的ID检索电影并将其发送给用户。
>要删除电影,用户应将删除请求发送到/api/tovers/:id。同样,该路线与上面相同,但是方法是不同的(即delete())。
><span>var Movie = require('../models/movie'); </span><span>var express = require('express'); </span><span>var router = express.<span>Router</span>();</span>
> Method Movie.Remove()从数据库中删除了一部电影,我们向用户发送一条消息,指示成功。
>>现在我们都设置了。但是等等!我们需要将路由器实例放在模块中。Exports,以便我们可以在应用中将其用作Middlewaree。因此,这是文件电影中的最后一行。
router<span>.route('/movies').get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span><span>});</span>
router<span>.route('/movies').post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span><span>});</span>
最后,我们配置了中间件:
router<span>.route('/movies') </span> <span>.get(function(req<span>, res</span>) { </span> <span>Movie.find(function(err<span>, movies</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movies); </span> <span>}); </span> <span>}) </span> <span>.post(function(req<span>, res</span>) { </span> <span>var movie = new Movie(req.body); </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.send({ message: 'Movie Added' }); </span> <span>}); </span> <span>});</span>
如您所见,我像其他任何中间件一样使用了路由器。我将 /API作为第一个参数to app.use(),以便将路由中间件映射到 /api。因此,最终我们的API URL变为:
router<span>.route('/movies/:id').put(function(req<span>,res</span>){ </span> <span>Movie.findOne({ _id: req.params.id }, function(err<span>, movie</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> <span>for (prop in req.body) { </span> movie<span>[prop] = req.body[prop]; </span> <span>} </span> <span>// save the movie </span> movie<span>.save(function(err) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json({ message: 'Movie updated!' }); </span> <span>}); </span> <span>}); </span><span>});</span>
/api/电影
通过运行节点bin/www.js,您的api应该升起!
router<span>.route('/movies/:id').get(function(req<span>, res</span>) { </span> <span>Movie.findOne({ _id: req.params.id}, function(err<span>, movie</span>) { </span> <span>if (err) { </span> <span>return res.send(err); </span> <span>} </span> res<span>.json(movie); </span> <span>}); </span><span>});</span>
>现在我们已经创建了API,我们应该对其进行测试,以确保所有内容都按预期工作。您可以使用邮递员(Chrome Extension)来测试所有端点。以下是一些屏幕截图,显示帖子并在Postman中进行了测试。
结论
});
在此示例中,向根路径('/')提出了get请求,服务器将以“ Hello World!”响应“ Hello World!”。
如何处理Express 4?
});
什么是Express 4中的中间件,我如何使用它? >中间件功能是可以访问请求对象(REQ),响应对象(RES)和应用程序请求响应周期中的下一个功能的函数。下一个功能是Express路由器中的一个函数,当调用时,该功能将执行成功当前中间件的中间件。中间件函数可以执行以下任务:执行任何代码,对请求和响应对象进行更改,结束请求响应周期,调用堆栈中的下一个中间件。
如何处理Express中的错误4?
您可以使用路由参数捕获URL中的动态值。然后,您的路由处理程序可以使用这些值。这是一个示例:
app.get('//users/:userId',function(req,res){
res.send('用户ID是:'req.params.userid);
} );
在此示例中,当向“/用户/123”提出Get请求时,服务器将使用“用户ID为:123”。 Express 4?
在此示例中,可以直接从root url('/')中直接访问'public''目录中的文件。
>如何在Express 4?
>如何我是否可以在Express 4?
中处理404个错误,您可以通过在中间件堆栈的末尾添加中间件功能来处理404错误。如果没有其他路由处理程序或中间件功能处理该请求,将执行此功能。这是一个示例:
app.use(function(req,res,sext){
> Express路由器中的路由器是Express 4中的迷你应用程序,可让您以模块化的方式组织路线。您可以使用Express.Router()创建一个新路由器,向其添加中间件和路由,然后在App.use()中使用它。这是一个示例:
var router = express.router();
router.get('/',function(req,res){
res.send('Router!'Hello!');
以上是用Express 4创建静止的API的详细内容。更多信息请关注PHP中文网其他相关文章!