express + nodejs + mongodb實作一個簡單的資料庫的增删改功能。
1 首先建立express工程目錄
---html
---node_modules
---resources
app.js #入口子產品
config.js #配置子產品
handler.js #業務處理子產品
router.js #路由子產品
package.json #包管理
2 直接先上資料庫代碼
本文主要是描述nodejs的mongodb資料庫操作,是以其餘代碼,可以看本文後邊,package.json檔案後面也有。如果想看包的清單和版本在後面~
業務處理子產品:handle.js
var path = require('path');
//在此導入mongodb
//當然,首先得安裝mongodb,且在工程目錄下npm i mongodb才可以導入進來。
var mongodb = require('mongodb');
// config.js主要配置了nodejs的端口号和 mongodb的端口号
var config = require('./config.js');
var url = require('url');
//外部由路由子產品router.js導入,這裡直接使用module.exports向外暴露一個API,
//1. 資料庫的“查查查查查查查查查查查查查”
module.exports.index = function (req, res) {
// 建立一個mongodb執行個體
var MongoClient = mongodb.MongoClient;
// 把這個執行個體連接配接到mongodb伺服器
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
// 這裡有個坑,新版本的mongo需要在連接配接成功後,連接配接一個資料庫。
// 注意:這裡的資料庫可以是mongodb中存在的,也可以是不存在的,如果不存在,則預設自動建立一個資料庫vueStudy。
var mydb = db.db('vueStudy');
// 查詢在vueStudy這個資料庫下 名為 prodlist 的 一個集合,
// find() 功能:這個集合下所有的資料全部導出。格式為JSON
// toArray 功能:變成一個數組,在回調函數中傳回一個docs,這個docs是一個數組。
mydb.collection('prodlist').find().toArray(function (err, docs) {
if (err) {
throw err;
}
// 關閉資料庫連接配接
db.close();
// 将最終的資料,以JSON格式發送給用戶端。
// 注意:1.這裡的docs,其實就是一個JSON對象,這個JSON對象的Body中有所有的資料。
// 2.在伺服器端隻能發送字元串,但在用戶端接收的時候,會自動變成對象。
res.end(JSON.stringify(docs));
});
});
};
//2. 資料庫的“增增增增增增增增增增增增增增增”
module.exports.add = function (req, res) {
//同上,就不在那麼詳細的寫了。
var MongoClient = mongodb.MongoClient;
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
var mydb = db.db('vueStudy');
// 執行查詢操作
mydb.collection('prodlist').find().toArray(function (err, docs) {
if (err) {
throw err;
}
// 關閉資料庫連接配接
var newData = {
//這個相當于取到最後一個元素的id,然後自增1.
id:docs[0].message[docs[0].message.length - 1].id + 1,
name:req.body.name,
ctime: new Date()
};
mydb.collection('prodlist').updateOne({"status":0},{$push : { "message": newData}});
db.close();
res.end('{status:0, message:"添加成功"}');
});
});
};
//2. 資料庫的“删删删删删删删删删删删删删删删删删删删删删删”
module.exports.del = function(req, res) {
var MongoClient = mongodb.MongoClient;
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
var id = undefined;
var reqUrl = req.url;
//調試資訊
//這裡,可能寫的有點蠢了...不過還懶得去找好方法...應該是能直接調用的
console.log('---------------------------' + reqUrl);
reqUrl = reqUrl.split('');
reqUrl.splice(0,1);
id = Number(reqUrl.join(''));
var mydb = db.db('vueStudy');
// 執行删除操作
// 執行查詢操作
mydb.collection('prodlist').updateOne({"status":0},{$pull : { "message": {"id":id}}});
db.close();
//這裡比較搞笑,明明我直接穿了一個JSON對象過去了,
//但是用戶端那邊接收到的就是一個string類型的字元串
//使用console.log列印出來也确實是Json格式的字元串
//但TM就是不能用JSON.parse()轉換成JSON格式的檔案...
// 是以這裡在用戶端那邊比對的時候,就直接是用字元串操作來比對的...
// str1.includes(str2)
res.end('{status:0, message:"删除成功"}');
});
};
其他檔案我就直接挨個展示了,需要調試的朋友,可以按照文頭的工程目錄結建構立,然後進行調試。
入口子產品:app.js
// app.js 子產品職責: 負責啟動服務
// 1. 加載 express 子產品
var express = require('express');
// 加載 config.js 子產品
var config = require('./config.js');
// 加載路由子產品
var router = require('./router.js');
var path = require('path');
// 1. 加載 body-parser 子產品
var bodyParser = require('body-parser');
// 2. 建立 app 對象
var app = express();
// 配置使用 ejs 模闆引擎,修改預設查找的模闆檔案字尾為 html
// 1. 設定模闆檔案的存放路徑
app.set('views', path.join(__dirname, 'htmls'));
// 2. 建立一個自己的模闆引擎,用來識别字尾是 html 的模闆檔案
app.engine('html', require('ejs').renderFile);
// 3. 使用剛才自己建立的這個模闆引擎
app.set('view engine', 'html');
// 配置 body-parser 插件(挂載 body-parser 中間件)
// 一定要在正式處理請求之前設定body-parser
// req.body
// 如果參數 extended: false,表示在bodyparser内部,使用node.js内置的 querystring 子產品把 使用者post送出的查詢字元串轉換為 json 對象
// 如果參數 extended: true,表示在bodyparser内使用第三方的 qs 子產品把 使用者post送出的查詢字元串轉換為 json 對象
app.use(bodyParser.urlencoded({extended: false}));
// 3. 注冊路由
// 設定app 與 router 相關聯
// app.use('/', router);
app.use(router);
// 4. 啟動服務
app.listen(config.port, function () {
console.log('http://localhost:' + config.port);
});
路由子產品:router.js
// 路由子產品,主要負責路由判斷
// 1. 建立一個 router 對象 (router 對象既是一個對象,也是一個函數)
var express = require('express');
// 加載業務子產品
var handler = require('./handler.js');
var path = require('path');
var router = express.Router();
router.get('/index', handler.index);
router.post('/add', handler.add);
router.use('/del',handler.del);
router.use('/lib', express.static(path.join(__dirname, 'lib')));
// 3. 傳回 router 對象
module.exports = router;
配置檔案:config.js
// 配置子產品,主要職責是負責儲存項目中的配置資訊
module.exports = {
port: 9090,
connStr: 'mongodb://localhost:27017/hackernews'
};