- ExpressJS 教程
- ExpressJS - 首页
- ExpressJS - 概述
- ExpressJS - 环境
- ExpressJS - Hello World
- ExpressJS - 路由
- ExpressJS - HTTP 方法
- ExpressJS - URL 构建
- ExpressJS - 中间件
- ExpressJS - 模板引擎
- ExpressJS - 静态文件
- ExpressJS - 表单数据
- ExpressJS - 数据库
- ExpressJS - Cookie
- ExpressJS - Session
- ExpressJS - 身份验证
- ExpressJS - RESTful API
- ExpressJS - 脚手架
- ExpressJS - 错误处理
- ExpressJS - 调试
- ExpressJS - 最佳实践
- ExpressJS - 资源
- ExpressJS 有用资源
- ExpressJS - 快速指南
- ExpressJS - 有用资源
- ExpressJS - 讨论
ExpressJS - 数据库
我们不断收到请求,但最终没有将它们存储在任何地方。我们需要一个数据库来存储数据。为此,我们将使用名为MongoDB的 NoSQL 数据库。
要安装并了解有关 Mongo 的信息,请访问此链接。
为了将 Mongo 与 Express 一起使用,我们需要 Node 的客户端 API。我们有多种选择,但对于本教程,我们将坚持使用mongoose。Mongoose 用于 MongoDB 的 Node 中的文档建模。对于文档建模,我们创建一个模型(类似于面向文档编程中的类),然后我们使用此模型生成文档(就像我们在 OOP 中创建类的文档一样)。我们所有的处理都将在这 些“文档”上进行,然后最终,我们将这些文档写入我们的数据库。
设置 Mongoose
现在您已安装 Mongo,让我们安装 Mongoose,就像我们安装其他 Node 包一样:
npm install --save mongoose
在开始使用 mongoose 之前,我们必须使用 Mongo shell 创建一个数据库。要创建新的数据库,请打开终端并输入“mongo”。Mongo shell 将启动,输入以下代码:
use my_db
将为您创建一个新的数据库。每当您打开 mongo shell 时,它都会默认为“test”数据库,您必须使用与上述相同的命令切换到您的数据库。
要使用 Mongoose,我们将在index.js文件中需要它,然后连接到在mongodb://上运行的mongodb服务。
var mongoose = require('mongoose');
mongoose.connect('mongodb:///my_db');
现在我们的应用程序已连接到我们的数据库,让我们创建一个新的模型。此模型将充当我们数据库中的集合。要创建新的模型,请在定义任何路由之前使用以下代码:
var personSchema = mongoose.Schema({
name: String,
age: Number,
nationality: String
});
var Person = mongoose.model("Person", personSchema);
以上代码定义了人的模式,并用于创建 Mongoose 模型Person。
保存文档
现在,我们将创建一个新的 HTML 表单;此表单将帮助您获取人的详细信息并将其保存到我们的数据库中。要创建表单,请在 views 目录中创建一个名为person.pug的新视图文件,内容如下:
html
head
title Person
body
form(action = "/person", method = "POST")
div
label(for = "name") Name:
input(name = "name")
br
div
label(for = "age") Age:
input(name = "age")
br
div
label(for = "nationality") Nationality:
input(name = "nationality")
br
button(type = "submit") Create new person
还在index.js中添加一个新的 get 路由以呈现此文档:
app.get('/person', function(req, res){
res.render('person');
});
转到“localhost:3000/person”以检查表单是否显示正确的输出。请注意,这只是一个 UI,它尚不可用。以下屏幕截图显示了表单的显示方式:
现在我们将定义一个在'/person'处的 post 路由处理程序,它将处理此请求
app.post('/person', function(req, res){
var personInfo = req.body; //Get the parsed information
if(!personInfo.name || !personInfo.age || !personInfo.nationality){
res.render('show_message', {
message: "Sorry, you provided worng info", type: "error"});
} else {
var newPerson = new Person({
name: personInfo.name,
age: personInfo.age,
nationality: personInfo.nationality
});
newPerson.save(function(err, Person){
if(err)
res.render('show_message', {message: "Database error", type: "error"});
else
res.render('show_message', {
message: "New person added", type: "success", person: personInfo});
});
}
});
在上面的代码中,如果我们收到任何空字段或未收到任何字段,我们将发送错误响应。但是,如果我们收到格式良好的文档,那么我们从 Person 模型创建一个newPerson文档,并使用newPerson.save()函数将其保存到我们的数据库中。这在 Mongoose 中定义,并接受回调作为参数。此回调有两个参数 - 错误和响应。这些参数将呈现show_message视图。
要显示此路由的响应,我们还需要创建一个show_message视图。使用以下代码创建一个新的视图:
html
head
title Person
body
if(type == "error")
h3(style = "color:red") #{message}
else
h3 New person,
name: #{person.name},
age: #{person.age} and
nationality: #{person.nationality} added!
成功提交表单(show_message.pug)后,我们将收到以下响应:
现在我们有了创建人员的界面。
检索文档
Mongoose 提供了许多检索文档的功能,我们将重点介绍其中的 3 个。所有这些函数也以回调作为最后一个参数,就像保存函数一样,它们的 аргументы是错误和响应。这三个函数如下:
Model.find(conditions, callback)
此函数查找与 conditions 对象中的字段匹配的所有文档。Mongo 中使用的相同运算符也适用于 mongoose。例如,
Person.find(function(err, response){
console.log(response);
});
这将从人员集合中获取所有文档。
Person.find({name: "Ayush", age: 20},
function(err, response){
console.log(response);
});
这将获取名称字段为“Ayush”且年龄为 20 的所有文档。
我们还可以提供所需的投影,即我们需要的字段。例如,如果我们只需要国籍为“印度”的人的姓名,则使用:
Person.find({nationality: "Indian"}, "name", function(err, response){
console.log(response);
});
Model.findOne(conditions, callback)
此函数始终获取单个最相关的文档。它与Model.find()具有完全相同的参数。
Model.findById(id, callback)
此函数以_id(由 mongo 定义)作为第一个参数,一个可选的投影字符串和一个回调来处理响应。例如,
Person.findById("507f1f77bcf86cd799439011", function(err, response){
console.log(response);
});
现在让我们创建一个路由来查看所有人员记录:
var express = require('express');
var app = express();
var mongoose = require('mongoose');
mongoose.connect('mongodb:///my_db');
var personSchema = mongoose.Schema({
name: String,
age: Number,
nationality: String
});
var Person = mongoose.model("Person", personSchema);
app.get('/people', function(req, res){
Person.find(function(err, response){
res.json(response);
});
});
app.listen(3000);
更新文档
Mongoose 提供 3 个更新文档的功能。这些函数如下所述:
Model.update(condition, updates, callback)
此函数以条件和更新对象作为输入,并将更改应用于集合中与条件匹配的所有文档。例如,以下代码将更新所有 Person 文档中的国籍“美国”:
Person.update({age: 25}, {nationality: "American"}, function(err, response){
console.log(response);
});
Model.findOneAndUpdate(condition, updates, callback)
它根据查询查找一个文档,并根据第二个参数更新该文档。它还以回调作为最后一个参数。让我们执行以下示例以了解该函数
Person.findOneAndUpdate({name: "Ayush"}, {age: 40}, function(err, response) {
console.log(response);
});
Model.findByIdAndUpdate(id, updates, callback)
此函数更新由其 id 标识的单个文档。例如,
Person.findByIdAndUpdate("507f1f77bcf86cd799439011", {name: "James"},
function(err, response){
console.log(response);
});
现在让我们创建一个路由来更新人员。这将是一个带有 id 作为参数且有效负载中包含详细信息的PUT路由。
var express = require('express');
var app = express();
var mongoose = require('mongoose');
mongoose.connect('mongodb:///my_db');
var personSchema = mongoose.Schema({
name: String,
age: Number,
nationality: String
});
var Person = mongoose.model("Person", personSchema);
app.put('/people/:id', function(req, res){
Person.findByIdAndUpdate(req.params.id, req.body, function(err, response){
if(err) res.json({message: "Error in updating person with id " + req.params.id});
res.json(response);
});
});
app.listen(3000);
要测试此路由,请在您的终端中输入以下内容(将 id 替换为您创建的人员中的 id):
curl -X PUT --data "name = James&age = 20&nationality = American "https://:3000/people/507f1f77bcf86cd799439011
这将使用上述详细信息更新与路由中提供的 id 关联的文档。
删除文档
我们已经涵盖了创建、读取和更新,现在我们将了解如何使用 Mongoose 来删除文档。我们这里有 3 个函数,与更新完全一样。
Model.remove(condition, [callback])
此函数以条件对象作为输入,并删除与条件匹配的所有文档。例如,如果我们需要删除所有 20 岁的用户,请使用以下语法:
Person.remove({age:20});
Model.findOneAndRemove(condition, [callback])
此函数根据条件对象删除单个最相关的文档。让我们执行以下代码以了解相同内容。
Person.findOneAndRemove({name: "Ayush"});
Model.findByIdAndRemove(id, [callback])
此函数删除由其 id 标识的单个文档。例如,
Person.findByIdAndRemove("507f1f77bcf86cd799439011");
现在让我们创建一个路由来从我们的数据库中删除人员。
var express = require('express');
var app = express();
var mongoose = require('mongoose');
mongoose.connect('mongodb:///my_db');
var personSchema = mongoose.Schema({
name: String,
age: Number,
nationality: String
});
var Person = mongoose.model("Person", personSchema);
app.delete('/people/:id', function(req, res){
Person.findByIdAndRemove(req.params.id, function(err, response){
if(err) res.json({message: "Error in deleting record id " + req.params.id});
else res.json({message: "Person with id " + req.params.id + " removed."});
});
});
app.listen(3000);
要检查输出,请使用以下 curl 命令:
curl -X DELETE https://:3000/people/507f1f77bcf86cd799439011
这将删除给定 id 的人员,并产生以下消息:
{message: "Person with id 507f1f77bcf86cd799439011 removed."}
这总结了我们如何使用 MongoDB、Mongoose 和 Express 创建简单的 CRUD 应用程序。要进一步了解 Mongoose,请阅读API 文档。
