1萎坷、在node中安裝一個可以連接mongodb數(shù)據(jù)庫的工具mongoose
安裝mongoose命令: npm i mongoose
image.png
2、在server.js中l(wèi)連接mongodb數(shù)據(jù)庫
2.1滤淳、引入mongoose模塊: const mongoose = require('mongoose')
2.2、連接mongodb數(shù)據(jù)庫:mongoose.connect('mongodb://localhost:27017/express-test')
//1脱篙、引入express模塊
const express = require('express');
//2娇钱、創(chuàng)建web服務(wù)器
const app = express();
// 1、引入mongoose模塊
const mongoose = require('mongoose')
// 2绊困、連接mongodb數(shù)據(jù)庫
// 因?yàn)檠b在本地文搂,所以使用localhost或http://127.0.0.1也可以
// mongodb:// 數(shù)據(jù)庫ip地址 :(默認(rèn)端口號:27017) /數(shù)據(jù)庫名稱
// ↓ ↓ ↓ ↓
// 固定格式mongoose.connect('mongodb:// localhost :27017 /express-test')
mongoose.connect('mongodb://localhost:27017/express-test')
// 使用app.use(引入cors包) 因?yàn)橐氲腸ors包是一個函數(shù),所以直接調(diào)用
app.use(require('cors')())
// 使用app.use托管靜態(tài)資源秤朗,通過express.static('靜態(tài)資源目錄煤蹭,一般叫public')
// 訪問public里面的靜態(tài)資源一定要通過/static文件夾下才能訪問
app.use('/',express.static('public'))
// 3、注冊路由
app.get('/product',function(req,res){
res.send([
{id:1,title:'apple'},
{id:2,title:'banner'},
{id:3,title:'lemon'}
])
});
//4取视、設(shè)置端口
app.listen(3000,()=>{
console.log('App listening on port 3000!')//服務(wù)器啟動后會打印這句話
})
3硝皂、啟動server.js,發(fā)現(xiàn)有兩個警告
image.png
4作谭、在server.js中添加兩個參數(shù){ useNewUrlParser: true,useUnifiedTopology: true }即可
//1稽物、引入express模塊
const express = require('express');
//2、創(chuàng)建web服務(wù)器
const app = express();
// 1折欠、引入mongoose模塊
const mongoose = require('mongoose')
// 2贝或、連接mongodb數(shù)據(jù)庫
// 因?yàn)檠b在本地吼过,所以使用localhost或http://127.0.0.1也可以
// mongodb:// 數(shù)據(jù)庫ip地址 :(默認(rèn)端口號:27017) /數(shù)據(jù)庫名稱
// ↓ ↓ ↓ ↓
// 固定格式mongoose.connect('mongodb:// localhost :27017 /express-test')
mongoose.connect('mongodb://localhost:27017/express-test',{ useNewUrlParser: true , useUnifiedTopology: true })
// 使用app.use(引入cors包) 因?yàn)橐氲腸ors包是一個函數(shù),所以直接調(diào)用
app.use(require('cors')())
// 使用app.use托管靜態(tài)資源咪奖,通過express.static('靜態(tài)資源目錄盗忱,一般叫public')
// 訪問public里面的靜態(tài)資源一定要通過/static文件夾下才能訪問
app.use('/',express.static('public'))
// 3、注冊路由
app.get('/product',function(req,res){
res.send([
{id:1,title:'apple'},
{id:2,title:'banner'},
{id:3,title:'lemon'}
])
});
//4羊赵、設(shè)置端口
app.listen(3000,()=>{
console.log('App listening on port 3000!')//服務(wù)器啟動后會打印這句話
})
5趟佃、再一次啟動時已經(jīng)沒有任何警告了
image.png
6、創(chuàng)建一個產(chǎn)品表
6.1昧捷、通過mongoose.model建立一個模型來創(chuàng)建一個產(chǎn)品表
// 創(chuàng)建產(chǎn)品表
// 通過mongoose.model建立一個模型闲昭,第一個參數(shù)為模型的名稱 ,第二個參數(shù)為表結(jié)構(gòu)
// 通過new mongoose.Schema({title:String})創(chuàng)建一個表結(jié)構(gòu)料身,里面?zhèn)鬟f一個對象汤纸,對象中寫字段/屬性(即一個產(chǎn)品中有哪些屬性)
const Product = mongoose.model('Product',new mongoose.Schema({
//屬性名:屬性類型
title:String
}))
6.2、為了測試芹血,就在server.js插入多條數(shù)據(jù)贮泞,服務(wù)器啟動后就需要把插入語句注釋掉,防止多次執(zhí)行幔烛,正常來說數(shù)據(jù)是從數(shù)據(jù)庫中執(zhí)行插入的
// 為了測試啃擦,通過insertMany向product插入3條數(shù)據(jù)
// 第一次執(zhí)行后就已經(jīng)插入了數(shù)據(jù),所以需要注釋掉饿悬,以免反復(fù)插入
Product.insertMany([
{title:'產(chǎn)品1'},
{title:'產(chǎn)品2'},
{title:'產(chǎn)品3'}
])
6.3令蛉、當(dāng)通過http://localhost:3000/product訪問時,會去查找Product中的數(shù)據(jù)
app.get('/product',async function(req,res){
// 每一次的數(shù)據(jù)庫查詢都是從node.js服務(wù)器里面去異步操作連接mongodb數(shù)據(jù)庫狡恬,所以要加await
// 只要使用await珠叔,外出的函數(shù)就需要添加async,因?yàn)閍wait和async是成對使用的
res.send(await Product.find())//通過find查找Product中的信息
});
訪問結(jié)果:_id是mongodb往數(shù)據(jù)庫存一條信息時會自動添加的一個id弟劲; __v是版本號
image.png
server.js整體代碼:
//1祷安、引入express模塊
const express = require('express');
//2、創(chuàng)建web服務(wù)器
const app = express();
// 1兔乞、引入mongoose模塊
const mongoose = require('mongoose')
// 2汇鞭、連接mongodb數(shù)據(jù)庫
// 因?yàn)檠b在本地,所以使用localhost或http://127.0.0.1也可以
// mongodb:// 數(shù)據(jù)庫ip地址 :(默認(rèn)端口號:27017) /數(shù)據(jù)庫名稱
// ↓ ↓ ↓ ↓
// 固定格式mongoose.connect('mongodb:// localhost :27017 /express-test')
mongoose.connect('mongodb://localhost:27017/express-test',{ useNewUrlParser: true , useUnifiedTopology: true })
// 創(chuàng)建產(chǎn)品表
// 通過mongoose.model建立一個模型庸追,第一個參數(shù)為模型的名稱 霍骄,第二個參數(shù)為表結(jié)構(gòu)
// 通過new mongoose.Schema({title:String})創(chuàng)建一個表結(jié)構(gòu),里面?zhèn)鬟f一個對象淡溯,對象中寫字段/屬性(即一個產(chǎn)品中有哪些屬性)
const Product = mongoose.model('Product',new mongoose.Schema({
//屬性名:屬性類型
title:String
}))
// 為了測試读整,通過insertMany向product插入3條數(shù)據(jù)
// 第一次執(zhí)行后就已經(jīng)插入了數(shù)據(jù),所以需要注釋掉咱娶,以免反復(fù)插入
// Product.insertMany([
// {title:'產(chǎn)品1'},
// {title:'產(chǎn)品2'},
// {title:'產(chǎn)品3'}
// ])
// 使用app.use(引入cors包) 因?yàn)橐氲腸ors包是一個函數(shù)绘沉,所以直接調(diào)用
app.use(require('cors')())
// 使用app.use托管靜態(tài)資源煎楣,通過express.static('靜態(tài)資源目錄,一般叫public')
// 訪問public里面的靜態(tài)資源一定要通過/static文件夾下才能訪問
app.use('/',express.static('public'))
// 3车伞、注冊路由
app.get('/product',async function(req,res){
// 每一次的數(shù)據(jù)庫查詢都是從node.js服務(wù)器里面去異步操作連接mongodb數(shù)據(jù)庫,所以要加await
// 只要使用await喻喳,外出的函數(shù)就需要添加async另玖,因?yàn)閍wait和async是成對使用的
res.send(await Product.find())//通過find查找Product中的信息
});
//4、設(shè)置端口
app.listen(3000,()=>{
console.log('App listening on port 3000!')//服務(wù)器啟動后會打印這句話
})