国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

express+mongoose實(shí)現(xiàn)對(duì)mongodb增刪改查操作詳解

2020-10-29 18:40:30
字體:
供稿:網(wǎng)友

本文實(shí)例講述了express+mongoose實(shí)現(xiàn)對(duì)mongodb增刪改查操作。分享給大家供大家參考,具體如下:

項(xiàng)目地址:https://github.com/jrainlau/mongoose_crud


寫在開頭

本文主要分享我如何使用express+mongoose對(duì)mongodb實(shí)現(xiàn)增刪改查操作,感謝cnode社區(qū)所有精品文章的幫助,以及@airuikun的開源項(xiàng)目airuikun/mongoose_crud對(duì)我的啟發(fā)。
學(xué)習(xí)nodejs已經(jīng)小半個(gè)月了,一直琢磨著做一些什么東西出來。由于有著一定的PHP經(jīng)驗(yàn),所以對(duì)數(shù)據(jù)庫的操作比較感興趣。乘著學(xué)習(xí)nodejs的勢(shì)頭,就打算把mongodb也一并學(xué)了。mongodb給我的感覺會(huì)比MySQL靈活一點(diǎn),也比較好上手。掌握了一定的mongodb知識(shí)以后,便開始著手開發(fā),實(shí)現(xiàn)最基礎(chǔ)的增刪改查功能。


項(xiàng)目準(zhǔn)備

首先你需要掌握一定的nodejs,express以及mongodb的知識(shí),并且已經(jīng)安裝好express和mongoose模塊,同時(shí)電腦安裝有mongodb。關(guān)于mongodb的問題,可以移步我的另一篇文章:win7下快速啟動(dòng)mongodb的方法,里面有詳細(xì)的安裝及配置過程。同時(shí)推薦使用robomongo作為mongodb的可視化操作工具,方便我們直接查看和操作數(shù)據(jù)庫。

項(xiàng)目開始

打開命令行,輸入
express -e mongoose_crud
“-e”表示使用ejs作為模版引擎(jade太丑不喜歡)。生成項(xiàng)目文件結(jié)構(gòu)以后,執(zhí)行
cd mongoose_crud && npm install安裝依賴包。
現(xiàn)在我們的項(xiàng)目應(yīng)該長這樣的(modules文件夾是我自己建的,后面會(huì)講到):


為了方便接下來的操作,推薦使用supervisor來啟動(dòng)項(xiàng)目
npm install supervisor -g
進(jìn)入我們的項(xiàng)目文件夾,我們改寫一下package.json文件,把里面的"scripts"改為下面的寫法

"scripts": { "start": "supervisor ./bin/www" },

以后要啟動(dòng)項(xiàng)目只需要在項(xiàng)目文件夾下,執(zhí)行npm start即可。

改寫文件

由于express自己生成的文件結(jié)構(gòu)不那么優(yōu)美,所以稍微修改一下,方便接下來的工作。
首先打開/route文件夾,刪除沒用的user.js,打開index.js,修改為下面的內(nèi)容:

'use strict'const routes = (app) => { app.get('/', (req, res, next) => {  res.render('index', { title: 'Jrain真的很帥'}) })}

然后打開app.js文件夾,修改為以下內(nèi)容:

var express = require('express');var path = require('path');var favicon = require('serve-favicon');var logger = require('morgan');var cookieParser = require('cookie-parser');var bodyParser = require('body-parser');var routes = require('./routes/index');var app = express();// view engine setupapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');// uncomment after placing your favicon in /publicapp.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));app.use(logger('dev'));app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));app.use(cookieParser());app.use(express.static(path.join(__dirname, 'public')));routes(app)// catch 404 and forward to error handlerapp.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});// error handlers// development error handler// will print stacktraceif (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', {  message: err.message,  error: err }); });}// production error handler// no stacktraces leaked to userapp.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} });});module.exports = app;

其實(shí)就是把路由管理從app.js遷移到了/routes/index.js,方便我們管理。

我們可以測(cè)試一下,在瀏覽器輸入localhost:3000,如果輸出不是“Jrain真的很帥”,那就是你的項(xiàng)目出了問題。OK,接下來就到真正的開發(fā)啦!

增刪改查功能實(shí)現(xiàn)

在根目錄下,新建一個(gè)modules文件夾,里面新建一個(gè)叫做my_class.js的文件。我們這個(gè)項(xiàng)目是建立一個(gè)班級(jí)學(xué)生管理系統(tǒng),能夠?qū)W(xué)生的姓名及學(xué)號(hào)進(jìn)行增刪改查的操作。文件內(nèi)容如下:

'use strict'const mongoose = require('mongoose')// 連接mongodbmongoose.connect('mongodb://localhost/test')// 實(shí)例化連接對(duì)象const db = mongoose.connectiondb.on('error', console.error.bind(console, '連接錯(cuò)誤:'))db.once('open', (callback) => { console.log('MongoDB連接成功?。?)})// 創(chuàng)建schemaconst classSchema = new mongoose.Schema({ name: String, studentId: Number})// 創(chuàng)建modelconst classModel = mongoose.model('newClass', classSchema) // newClass為創(chuàng)建或選中的集合module.exports = classModel

每一段的作用看注釋即可?,F(xiàn)在我們已經(jīng)把項(xiàng)目跟mongodb連接好了,可以進(jìn)行接下來的步驟。

我們會(huì)有5個(gè)頁面,分別是首頁,學(xué)生信息增加頁面,學(xué)生刪除頁面,學(xué)生修改頁面,學(xué)生查找頁面。在/views文件夾內(nèi)建立相應(yīng)的ejs文件即可,代碼就不貼了,可以直接到項(xiàng)目去看:
https://github.com/jrainlau/mongoose_crud/tree/master/views

然后我們回到/routes/index.js,我們幾乎所有的邏輯都會(huì)在這里面進(jìn)行。

把當(dāng)中內(nèi)容修改為下面的代碼:

'use strict'const classModel = require('../modules/my_class')const routes = (app) => { // 首頁 app.get('/', (req, res, next) => {  let response = res  classModel.find({}, (err, result, res) => {   if(err) return console.log(err)   response.render('index', { result })  }) }) // 增加學(xué)生信息 app.get('/create', (req, res, next) => {  res.render('create', {}) }) app.post('/create', (req, res, next) => {  let newStudent = [{   name: req.body.name,   studentId: req.body.student_id  }]  classModel.create(newStudent, (err) => {   if(err) return console.log(err)   res.send("<a href='/'>添加成功,點(diǎn)擊返回首頁</a>")  }) }) // 刪除學(xué)生信息 app.get('/del', (req, res, next) => {  let response = res  classModel.find({}, (err, result, res) => {   if(err) return console.log(err)   response.render('del', { result })  }) }) app.post('/del', (req, res, next) => {  classModel.remove({_id: req.body.student}, (err, result) => {   if(err) return console.log(err)   console.log(result.result)   res.send("<a href='/'>刪除成功,點(diǎn)擊返回首頁</a>")  }) }) // 修改學(xué)生信息 app.get('/update', (req, res, next) => {  let response = res  classModel.find({}, (err, result, res) => {   if(err) return console.log(err)   response.render('update', { result })  }) }) app.post('/update', (req, res, next) => {  console.log(req.body)  let num = req.body.num,   condiction = {_id: req.body._id[num]},   query = {$set: {name: req.body.name[num], studentId: req.body.student_id[num]}}  classModel.update(condiction, query, (err, result) => {   if(err) {    console.log(err)    res.send('<script>alert("請(qǐng)勾選待修改的學(xué)生")</script>')   }   res.send("<a href='/'>修改成功,點(diǎn)擊返回首頁</a>")  }) }) // 查找學(xué)生 app.get('/reach', (req, res, next) => {  let result = null  res.render('reach', { result }) }) app.post('/reach', (req, res, next) => {  console.log(req.body)  let response = res  let reachType = req.body.reach_type,   keyWord = req.body.keyword  if (reachType == 0) {   classModel.find({name: keyWord}, (err, result) => {    if(err) return console.log(err)    response.render('reach', { result })   })  } else {   classModel.find({studentId: keyWord}, (err, result) => {    if(err) return console.log(err)    response.render('reach', { result })   })  } })}module.exports = routes

其原理是,程序通過post請(qǐng)求接收參數(shù),進(jìn)行相應(yīng)的操作,實(shí)現(xiàn)增刪改查的功能。主要用到的API有如下幾個(gè):

  • .find(),作為讀取、查找學(xué)生信息用。

  • .create(),作為增加學(xué)生信息用。它是基于mongoose中的model的操作,傳入一個(gè)json對(duì)象作為需要添加的內(nèi)容,具體可自行查閱。

  • .update(),作為更新學(xué)生信息用。

  • .remove(),作為刪除學(xué)生信息用。

我們的項(xiàng)目已經(jīng)全部完成了,測(cè)試一下吧!

尾聲

這篇東西不是教程,僅作為自己學(xué)習(xí)的一個(gè)記錄。如果能夠?qū)λ擞杏镁妥詈美玻绻X得我哪里說得不對(duì)也歡迎指正。謝謝大家~!

希望本文所述對(duì)大家MongoDB數(shù)據(jù)庫程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
日本视频二区| 四虎精品成人a在线观看| 日本欧美在线视频免费观看| 91精品专区| 91亚洲精选| av丝袜在线| 国产中文字幕在线观看| 日本一本久久| 中文字幕在线免费| 在线观看wwww| 九九热在线观看视频| 国产羞羞视频在线播放| 国产www在线观看| 美女永久在线网站| 国产系列在线观看| 亚洲欧美精品日韩欧美| 国产免费视频在线| 中文字幕不卡免费视频| 伊人222成人综合网| 激情网站在线| 69堂视频在线观看国产| 超碰在线97国产| 国产日本视频| 欧美日韩一区二区三区视视频 | 五月婷婷在线观看| 精品一区二区三区高清免费不卡| 亚洲成年人视频| 国产一二三区在线视频| 青娱乐在线视频观看| 国产精品人人| 国产免费福利| av资源网站在线观看| 2020亚洲男人天堂| 中文字幕日本三级| 超碰免费在线观看| av免费在线一区二区三区| 国产精品扒开做爽爽爽的视频| 激情网站在线| 国产麻豆麻豆| 黄色网页网址在线免费| 不卡av免费观看| 日本国产在线| 欧美日韩视频精品一区二区| 99爱在线观看| 亚洲欧美日韩综合精品网| 中文日本在线观看| 国产a级网站| 91午夜视频| 免费看的av| 亚洲精品国自产拍在线观看| 国产激情视频一区二区三区| 国产网友自拍电影在线| 国产一级激情| 久久国产情侣| 超碰在线网址| 狠狠操视频网| 国产精品亚洲第五区在线| 国产九九九九| 最近中文字幕在线中文视频| 国产羞羞视频在线播放| 国产国语**毛片高清视频| 国产精品毛片一区二区三区四区| 国产对白国语对白| heisi视频网在线观看| av日韩国产| 青青草免费在线视频| 国产女人在线观看| 2019中文字幕视频| 美女网站在线观看| 国产精品欧美韩国日本久久| 精精国产xxxx视频在线动漫| 男人天堂亚洲| 国产极品嫩模在线视频一区| www.操.com| 国产视频中文字幕在线观看| 国产探花视频在线观看| 国产黄网站在线观看| 亚洲欧美精选| 91超碰在线免费| 国产福利免费在线观看| 免费电影网站在线视频观看福利| 久久精品蜜桃| av手机免费观看| 国产亚洲精品自在线观看| 亚洲男人网站| 91最新在线| 最近中文字幕mv2018在线高清| 精品一区二区在线欧美| 中文字幕专区| 国产综合视频一区二区三区免费| 国产porny蝌蚪视频| 五月伊人六月| 国产在线色视频| 日本在线观看网站| 国产日产一区二区| 国产精选在线观看| 免费在线看v| 日p在线观看| 在线播放www| 9999在线视频| 国产传媒在线播放| 国产三级视频在线| 国产欧美在线观看视频| 国产精品人人| 国产成人综合亚洲欧美在| 国产男女无套在线播放| 精品国内自产拍在线视频| 午夜国产视频| 日本在线视频www鲁啊鲁| 国产人成精品| 国产对白叫床清晰在线播放| 国产丝袜精品丝袜| 国产高清视频在线播放| 国产天堂av| 国产成人综合亚洲欧美在| 国产精品久久精品牛牛影视| 国产高清免费在线播放| 永久av在线| 狠狠狠狠狠狠操| 国产一级粉嫩xxxx| 国产欧美日本亚洲精品一4区| 国产精品入口麻豆免费看| 国产超碰在线观看| 欧美日韩亚洲第一页| 九九在线视频| 国产一级在线| 亚洲wwwwww| 99视频免费在线观看| 国产欧美黑人| 日本成人网址| 好看的中文字幕在线播放| 国产9色视频| 日本在线天堂| 国产乱码在线| 日本综合一区二区三区| 国产三级在线免费观看| eeuss影院在线观看| 国产午夜电影| 欧美xxxxx性| 国产激情视频一区二区| 青青久草在线| 国产对白叫床清晰在线播放| 蜜桃av在线免费观看| 国产第一页在线| 高清av中文在线字幕观看1| av二区三区| 97人人在线| 国产三级免费观看| 国产午夜精品久久久久免费视| www.夜夜操| 99综合精品久久| 国产欧美日韩专区| 中文字幕在线免费看| 欧美日韩在线视频免费观看| 18 激情视频在线| 国产视频精选在线| 国产精品自产拍在线网站| 青青草原国产在线| 中文字幕av网| 永久免费av网站| 伊人网在线视频| 国产高潮av| 在线中文字幕资源| 精品国产高清a毛片无毒不卡| 国产一级黄色电影| 国产色视频网站| 国产福利资源| 69视频在线| 亚洲欧美一区二区三区在线播放| 国产精品免费视频二三区| 国产视频一二区| 国产导航在线| 在线观看视频污| 美女网站在线观看| 国产一级二级在线| 中文国产字幕在线观看| 日本在线免费中文字幕| 超碰在线网址| 中文字幕第一页av| 国产成人精品久久一区二区小说 | 国产精品伦理一区二区三区 | 91精品国产高久久久久久五月天| 国产成人精品18| av在线官网| 天天操人人干| 国产精品jvid在线观看| av网址在线看| 最近免费中文字幕在线第一页 | av片在线观看永久免费| 日本片在线看| 国产亚洲精品自在线观看| av高清资源| 丁香视频免费观看| 在线视频观看亚洲| 99视频资源网| 美女av在线播放| av亚洲男人天堂| 国产精品视频一区二区图片| 午夜影院免费| 91涩漫在线观看c|