# 重新封装了一下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. 从零学脚手架(二)---初识webpack

    在上一篇中,介绍了 webpack 的 entry . output . plugins 属性. 在这一篇,接着介绍其它配置属性. mode 这个属性在上一篇中使用过一次:设置 webpack 编译模 ...

  2. C# 应用 - 封装类访问 Mysql 数据库

    个人经历的项目主要都是用 Postgresql 或 Oracle 数据库,本文非原创,从他处整理而来. 1. 库类 mysql.data.dll using MySql.Data.MySqlClien ...

  3. C# 基础 - string 和 Datetime

    1. string 1. 格式化填充 string str = "this {0} a {1}"; Console.WriteLine(string.Format(str, &qu ...

  4. 如何使用python把json文件转换为csv文件

    @ 目录 了解json整体格式 转换格式 提取key和value 使用pandas写入csv 了解json整体格式 这里有一段json格式的文件,存着全球陆地和海洋的每年异常气温(这里只选了一部分): ...

  5. zxy的猪错误

    我觉得这篇文章还是要重构啊,如果哪道题调的久了就标上日期放上来吧. 2021/3/10 题目:玩游戏 \(\tt memset\) 不能直接清空一个指针指向的数组,因为不知道 \(\tt size\) ...

  6. Redis的常用淘汰策略以及算法实现

    一.Redis的内存配置 1,Redis配置内存为多少合适? 默认:如果不设置最大内存大小或者设置最大内存大小为0,在64为操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存. 极限情况: ...

  7. Go语言学习笔记——Go语言的make的理解

    实例:https://tour.go-zh.org/moretypes/10 谢大<Go Web编程>书中的讲解https://github.com/astaxie/build-web-a ...

  8. scala集合上常用的方法

    sacala 关于集合常用的操作 map1.映射:对集合中的每一个元素进行执行某一项操作2.返回值类型,正常情况不变,原来集合是什么类型,就返回什么类型3.元素类型,根据我们函数的返回值类型 val ...

  9. Masterwoker模式

    1 public class Task { 2 3 private int id; 4 private int price ; 5 public int getId() { 6 return id; ...

  10. 吃透 MQ

    本文主要讲解 MQ 的通用知识,让大家先弄明白:如果让你来设计一个 MQ,该如何下手?需要考虑哪些问题?又有哪些技术挑战? 有了这个基础后,我相信后面几篇文章再讲 Kafka 和 RocketMQ 这 ...