📜  Node.js 和 MongoDB 上的 RESTfull 路由

📅  最后修改于: 2022-05-13 01:56:42.748000             🧑  作者: Mango

Node.js 和 MongoDB 上的 RESTfull 路由

REST代表具象状态传输,它基本上提供了一种将 HTTP 动词(如(GET、POST、PUT、DELETE)与 CRUD 操作(如(CREATE、READ、UPDATE、DELETE))映射的方法。每当我们点击网页上的链接时,我们基本上是在进行从一个页面到另一个页面的状态转移。例如,当我们点击博客网站的主页时,我们想要获取存储在服务器数据库中的所有博客,这基本上是 HTTP GET 请求与数据库的 READ 请求的映射。

同样,我们与数据库交互的 HTTP 请求也更多,例如创建博客、编辑博客、删除博客等等。 RESTfull 路由是如何实现这些映射的标准约定。如果没有 RESTfull 路由,您不一定无法实现此类功能,但这些是大多数开发人员遵循的最简单和标准的路由。我们将通过创建一个简单的博客应用程序来了解它们是如何工作的,我们可以在其中删除、添加、创建、编辑和显示博客。

FunctionalityPathHTTPExpected Output
Index/blogsGETList all blog posts
New/blogs/newGETShow a form to get blog info
Create/blogsPOSTAdd blog to database and redirect to home page
Show/blogs/:idGETShow a blog having given id
Edit/blogs/:id/editGETShow edit form for a blog
Update/blogs/:idPUTUpdate a particular blog and redirect to updated blog
Destroy/blogs/:idDELETEDelete a particular blog and redirect to home page

我们将使用 node.js 来服务网页和 MongoDB 来存储数据。整个代码在 Github 上可用,其中包括如何与数据库交互和配置所有依赖项。只是为了对下面的数据模式有一点了解是我们博客文章的模式。

注意:完整代码可在 Github 获得

var blogSchema = new mongoose.Schema({
    title: String,
    image: String,
    body: String,
    created: {type: Date, default: Date.now}
});
  
var Blog = mongoose.model("Blog", blogSchema);

索引页面(GET):对于索引页面,我们要显示存储在数据库中的所有博客。为此,首先我们将使用 MongoDB 的 find()函数从数据库中获取所有数据,然后将结果发送到显示这些帖子的页面。我们正在查找存储在数据库中的所有博客文章,我们正在使用内部函数检索和处理这些文章,如果发生错误,我们将发送到控制台 ERROR!消息,如果一切正常,那么我们正在渲染索引页面,我们将所有博客作为数据(博客)传递,其中基本上包含所有博客信息。索引页面进一步使用它来显示这些数据。

// Routes
app.get("/blogs", function(req, res){
    Blog.find({}, function(err, blogs){
        if (err) {
            console.log("ERROR!");
        } else {
            res.render("index.ejs", {blogs: blogs});
        }
    });
});

文件名:index.ejs

<% blogs.forEach(function(blog){ %>
    
    <%= blog.title %>
    <%= blog.created.toDateString() %>...
    <%- blog.body.substring(0, 50) %>
    Read More   
<% }) %>

新博客(GET)和创建博客(POST):我们想添加一个新博客,所以我们需要获取将接受用户输入的表单。因此,首先我们将使用 new.ejs 来呈现表单,然后我们将填写所有信息,然后,我们希望将其保存到数据库中,我们将通过执行 POST 请求来完成。请注意,我们的路由与上面相同,但这里仅更改了请求类型,将单独处理。我们正在使用 MongoDB create()函数创建一个新的博客文章。如果我们没有收到任何错误,我们将直接转到用户可以看到已添加博客的主页并确认操作成功执行。

// Render the new.ejs page that contains
// the form for adding a blog
app.get("/blogs/new", function (req, res) {
    res.render("new.ejs");
});
  
// Add data to database and redirect to
// home page where we see the new page
// with updation
app.post("/blogs", function (req, res) {
    Blog.create(req.body.blog, function (err, newBlog) {
        if (err) {
            console.log("ERROR!");
        } else {
            res.redirect("/blogs");
        }
    });
});

文件名:new.ejs

                                  

Show(GET):通常,博客主页不会完全显示所有博客,它只显示开头几行,如果用户想根据标题和预览来阅读它,我们希望指向一个新页面,其中整个在我们的案例中显示了博客,我们将重定向到 show.ejs HTML 文件。为此,所有博客都有与之关联的唯一 id,如果我们想显示特定博客,我们将简单地获取该博客的 id 并使用 findById() 获取数据并将其发送到 show.ejs HTML 文件中的数据将显示。

// Routes
app.get("/blogs/:id", function(req, res){
    Blog.findById(req.params.id, 
        function(err, foundBlog){
        if (err) {
            console.log("ERROR!");
        } else {
            res.render("show.ejs", 
                {blog: foundBlog});
        }
    });
});

文件名:show.ejs

<%= blog.title %>

<%= blog.created.toDateString() %>

<%- blog.body %>

Edit
    

编辑(GET)和更新(PUT):有时我们想要编辑博客,我们首先需要博客的唯一ID,然后将用户发送到不同的页面,其中显示的表单预先填充了以前的数据和用户该用户将发送到更新的博客后将更新其数据。为此,首先获取进入 edit.ejs 页面的请求,然后我们将使用 PUT 请求,该请求将使用 MongoDB 的 findByIdAndUpdate()函数使用给定 ID 下已经存在于数据库中的数据更新数据。

app.get("/blogs/:id/edit", function(req, res){
    Blog.findById(req.params.id, function(err, foundBlog){
        if (err){
            console.log("ERROR!");
        } else {
            res.render("edit.ejs", {blog: foundBlog});
        }
    });
});
  
app.put("/blogs/:id", function(req, res){
   Blog.findByIdAndUpdate(req.params.id, 
    req.body.blog, function(err,updatedBlog){
       if (err) {
           console.log("ERROR!");
       } else {
           res.redirect("/blogs/"+req.params.id);
       }
   });
});
Edit <%= blog.title %>
?_method=PUT"     method="POST">                                          

Destroy(DELETE):最后,如果我们要删除特定的博客,我们将简单地使用博客的 ID 并使用 MongoDB 的 findByIdAndRemove()函数从数据库中删除特定的博客。

app.delete("/blogs/:id", function(req, res){
    Blog.findByIdAndRemove(req.params.id, function(err){
        if (err) {
            res.redirect("/blogs");
        } else {
            res.redirect("/blogs");
        }
    });
});