# 重新封装了一下NODE-MONGO 使其成为一个独立的服务.可以直接通过get/post来操作

# consts.js 配置用的数据,用于全局参数配置

# log.js 自己写的一个简单的存储本地log的功能,数据库异常或者逻辑上产生异常数据的时候输出查错

# servicemongo.js 主服务程序,可以直接node servicemongo.js 启动,挂起端口服务

# routemongo.js 请求路由相关

# mongo.js 封装了一些基本的node对mongo操作

# 使用方法,直接node  servicemongo.js 就行,也可以在另一个项目里调用servicemongo的start 

# 注意 node包没传,缺什么自己安装什么吧,看下错误日志,缺什么就直接npm i XXX 装上就好

项目我打包上传到资源了(待审核状态,差不多明天就能下载了):

https://me.csdn.net/download/u013761036

consts.js

module.exports = {
default: {
defaultDataServicePort: 2323,//数据库服务接口端口
defaultMongoUrl : 'mongodb://localhost:27017/',//Mongo数据库连接地址
}
}

log.js

var fs = require('fs');
const sd = require('silly-datetime'); //输出log的时候,可以传过来一个key,来代表这个是谁输出的,建议是文件名字+函数名字 xxx.js-funxx
//consolelog('main.js-main', 'star-ok');
function consolelog(key, data) {
try {
if ('string' != typeof data) {
data = JSON.stringify(data);
}
let formatData = sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss') + '->' + key + '\n';
formatData = formatData + data + '\n\n';
// 创建一个可以写入的流,写入到文件 xxx-xx-xx.log 中,日期
let outPutLogFilePath = "./" + sd.format(new Date(), 'YYYY-MM-DD') + ".log";
var writerStream = fs.createWriteStream(outPutLogFilePath, { 'flags': 'a' });
writerStream.write(formatData, 'UTF8');
writerStream.end();
writerStream.on('finish', function () {
//console.log("写入完成。");
});
writerStream.on('error', function (err) {
//console.log(err.stack);
});
} catch (e) { }
}
module.exports = {
consolelog,
};

mongo.js

const url = require('url');
const { MongoClient, ObjectId } = require('mongodb');
const sd = require('silly-datetime');
const _ = require('lodash');
const { consolelog } = require('./log');
const config = require('./consts');
const { defaultMongoUrl: mongourl } = _.get(config, 'defaultMongoUrl', config.default); const goError = (mongoLink, req, res, body = null) => {
//数据库操作失败一定全都打log出来。
const params = url.parse(req.url, true).query;
let logMess = 'Mongo operation failed:' + JSON.stringify(params);
if (body) {
logMess = logMess + '\nBody:' + JSON.stringify(body);
}
consolelog('mongo.js-goError', logMess);
if (mongoLink != null) {
mongoLink.close();
}
res.end();
} //查询数据,条件查询,但是不支持ObjectID,条件的格式是{"key":"value"}
const findMongo = (dbname, collection, where, req, res) => {
MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res);
}
try {
where = JSON.parse(where);
} catch (e) {
return goError(client, req, res);
}
const db = client.db(dbname);
db.collection(collection).find(where).sort({ updateTime: -1 }).toArray(function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} //查询数据,value专门支持ObjectID类型,key可以是_id,也可以是别的
const findMongoByKOBJV = (dbname, collection, key, value, req, res) => {
MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res);
}
const db = client.db(dbname);
const were = {};
try {
were[key] = ObjectId(value);
} catch (e) {
return goError(client, req, res);
}
db.collection(collection).find(were).sort({ updateTime: -1 }).toArray(function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} //根据条件删除数据,不支持ObjectID类型
const deleteMongo = (dbname, collection, body, req, res) => {
MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
const db = client.db(dbname);
if (body.were == null) {//卡一下,防止出人命!
return goError(client, req, res, body);
}
let were = null;
try {
were = JSON.parse(body.were);
} catch (e) {
return goError(client, req, res, body);
}
db.collection(collection).deleteMany(were, function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
//{"result":{"n":0,"ok":1},"connection":{"id":6,"host":"localhost","port":27017},"deletedCount":0,"n":0,"ok":1}
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} const deleteMongoByKOBJV = (dbname, collection, body, req, res) => { MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
const db = client.db(dbname);
let key = body.key;
let value = body.value;
if ((!key) || (!value)) {//卡一下,防止出人命!
return goError(client, req, res, body);
}
let were = {};
try {
were[key] = ObjectId(value);
} catch (e) {
return goError(client, req, res, body);
} db.collection(collection).deleteMany(were, function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
//{"result":{"n":0,"ok":1},"connection":{"id":4,"host":"localhost","port":27017},"deletedCount":0,"n":0,"ok":1}
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} //插入一条数据
const insertMongo = (dbname, collection, body, req, res) => {
MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
let db = client.db(dbname);
//自动添加创建时间和修改时间
body[0]['createdAt'] = new Date();
body[0]['updatedAt'] = new Date();
db.collection(collection).insertMany(body, function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
//{"result":{"ok":1,"n":1},"ops":[{"v1":"1111","v2":"2222","createdAt":"2019-11-05T08:07:37.087Z","updatedAt":"2019-11-05T08:07:37.087Z","_id":"5dc12dc99af00a30429a4b5c"}],"insertedCount":1,"insertedIds":{"0":"5dc12dc99af00a30429a4b5c"}}
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} const updateById = (dbname, collection, body, req, res) => { MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
let db = client.db(dbname);
let _id = null;
let updata = null;
try {
_id = ObjectId(body.id);
updata = JSON.parse(body.data);
updata['updatedAt'] = new Date();
} catch (e) {
return goError(client, req, res, body);
}
let updateCmd = { $set: updata };
db.collection(collection).updateOne({ _id }, updateCmd, function (err, datas) {
//if (err) throw err;
if (err) {
return goError(client, req, res, body);
}
res.writeHead(200, { "Content-Type": "text/plain; charset=utf8" });
//{"result":{"n":1,"nModified":1,"ok":1},"connection":{"id":2,"host":"localhost","port":27017},"modifiedCount":1,"upsertedId":null,"upsertedCount":0,"matchedCount":1,"n":1,"nModified":1,"ok":1}
res.end(JSON.stringify(datas));
client.close();
});
});
return;
} module.exports = {
updateById,
findMongoByKOBJV,
deleteMongoByKOBJV,
deleteMongo,
findMongo,
insertMongo
};

routemongo.js

const url = require('url');
const mongo = require('./mongo');
const querystring = require('querystring');
const { consolelog } = require('./log'); const workFind = async (req, res) => {
const params = url.parse(req.url, true).query;
switch (params.cmd) {
case 'query': {
mongo.findMongo(params.n, params.c, params.w, req, res);
} break;
case 'querykeyid': {
mongo.findMongoByKOBJV(params.n, params.c, params.k, params.v, req, res);
} break;
default: {
res.end();
}; break;
}
} const workUpdate = async (req, res) => {
const params = url.parse(req.url, true).query;
let postdata = '';
req.on('data', function (chunk) {
postdata += chunk;
});
req.on('end', async function () {
if (postdata == '') {//过滤掉这种,防止后面误操作破坏数据库数据
return res.end();
}
let postdataobj = null;
try {
postdataobj = querystring.parse(postdata);
} catch (e) {
let logMess = 'Mongo operation failed:\n' + JSON.stringify(params) + '\npostdata:' + postdata
consolelog('routemongo.js-workUpdate', logMess);
return res.end();
}
try {
switch (params.cmd) {
case 'delete': {
mongo.deleteMongo(params.n, params.c, postdataobj, req, res);
} break;
case 'deletekeyid': {
mongo.deleteMongoByKOBJV(params.n, params.c, postdataobj, req, res);
} break;
case 'insert': {
const postdataobjarr = [postdataobj];
mongo.insertMongo(params.n, params.c, postdataobjarr, req, res);
} break;
case 'updatebyid': {
mongo.updateById(params.n, params.c, postdataobj, req, res);
} break;
default: {
res.end();
}; break;
}
} catch (e) {
datas = null;
}
});
} module.exports = {
workFind,
workUpdate
};

servicemongo.js

const http = require('http');
var url = require("url");
const routemongo = require('./routemongo');
const config = require('./consts');
const { consolelog } = require('./log');
const _ = require('lodash'); const route = async (req, res) => {
switch (url.parse(req.url).pathname) {
case "/find": {//查
routemongo.workFind(req, res);
}; break;
case "/update": {//增 删 改
routemongo.workUpdate(req, res);
}; break;
default: {
res.end();
} break;
}
} const start = async () => {
const { defaultDataServicePort } = _.get(config, 'defaultDataServicePort', config.default);
consolelog('servicemongo.js-start', 'start:' + defaultDataServicePort);
http.createServer(function (req, res) {
route(req, res);
}).listen(defaultDataServicePort);
}; module.exports = {
start,
}; start();

重新封装了一下NODE-MONGO 使其成为一个独立的服务.可以直接通过get/post来操作的更多相关文章

  1. 【node】用koa搭建一个增删改服务(一)

    前文,vue分类里有一个日志demo的练习,这篇文章就是介绍针对日志demo的服务是怎么写的 一.koa搭建项目 1. npm init 2. npm install koa 二.建数据库 下面是项目 ...

  2. Node.js的cluster模块——Web后端多进程服务

    众所周知,Node.js是单线程的,一个单独的Node.js进程无法充分利用多核.Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机 ...

  3. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  4. 前端使用node.js的http-server开启一个本地服务器

    前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...

  5. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  6. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  7. es6模板字符串使用使${} 来包裹一个变量或者一个表达式

    es6模板字符串使用使${} 来包裹一个变量或者一个表达式 2019-04-28 14:33:54 Gabriel_wei 阅读数 1774  收藏 更多 分类专栏: 前端   版权声明:本文为博主原 ...

  8. k8s 使本地集群支持 LoadBalancer 服务

    k8s 使本地集群支持 LoadBalancer 服务 为了使本地集群支持 LoadBalancer 服务,可以参考以下两种实现方案: keepalived-cloud-provider metalL ...

  9. Codeforces Round #304 (Div. 2) B. Soldier and Badges【思维/给你一个序列,每次操作你可以对一个元素加1,问最少经过多少次操作,才能使所有元素互不相同】

    B. Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

随机推荐

  1. PTA甲级—常用技巧与算法

    散列 1078 Hashing (25 分) Quadratic probing (with positive increments only) is used to solve the collis ...

  2. 聊聊IT技术人的知识体系

    我在我的2020年终总结中提到技术人需要建立自己的知识体系,那么怎么建立自己的知识体系呢?技术人的知识体系又是什么样的呢?今天,和你一一分享. 1 关于我的12字方针 我在我的<2020年终回顾 ...

  3. struct2中package的参数解析

    struct2框架的核心组件是action和拦截器,它使用包来管理action和拦截器,每个包就是多个action.多个拦截器引用的集合.在struct.xml中,package元素用于定义包的配置, ...

  4. CF533F Encoding 题解

    题目链接CF533F Encoding 提示1:   \(\mathcal O(26^2*n)\) 的算法可通过.常用的几种字符串匹配算法kmp,AC自动机,哈希都可以解决该问题 (后两者可以优化到 ...

  5. python基础学习之简化占位符和格式化的概念

    简化版占位符有哪些? %s   字符串占位符,代表该位置有一个字符串待替换(万能) %d   数字占位符,代表该位置有一个数字待替换 %f    同上,这里是浮点数,float[默认保留6位小数] % ...

  6. JAVA视频资料百度网盘分享

    1.javascript视频教程 链接: http://pan.baidu.com/s/1gd57FVH 密码: d9ei 2.JPA视频教程 链接: http://pan.baidu.com/s/1 ...

  7. mongodb为什么比mysql效率高

    首先是内存映射机制,数据不是持久化到存储设备中的,而是暂时存储在内存中,这就提高了在IO上效率以及操作系统对存储介质之间的性能损耗.(毕竟内存读取最快) 其次,NoSQL并不是不使用sql,只是不使用 ...

  8. Java 多线程 | 并发知识问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  9. LamPiao靶机work_through

    前言 oscp靶机系列的第二篇.只追求做出来的话,这靶机蛮简单的.但是为了提升难度,尽量避免使用msf--毕竟考试只准用一次嘛,自己写了个exp. 正文 主机发现 nmap -sP 192.168.2 ...

  10. OO_Unit4_Summary暨课程总结

    初始oo,有被往届传言给吓到:oo进行中,也的确有时会被作业困扰(debug到差点放弃):而oo即将结束的此刻,却又格外感慨这段oo历程. 一.单元架构设计 本单元任务是设计一个UML解析器,能够支持 ...