重新封装了一下NODE-MONGO 使其成为一个独立的服务.可以直接通过get/post来操作
# 重新封装了一下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来操作的更多相关文章
- 【node】用koa搭建一个增删改服务(一)
前文,vue分类里有一个日志demo的练习,这篇文章就是介绍针对日志demo的服务是怎么写的 一.koa搭建项目 1. npm init 2. npm install koa 二.建数据库 下面是项目 ...
- Node.js的cluster模块——Web后端多进程服务
众所周知,Node.js是单线程的,一个单独的Node.js进程无法充分利用多核.Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机 ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- 前端使用node.js的http-server开启一个本地服务器
前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...
- npm 是node.js下带的一个包管理工具
npm 是node.js下带的一个包管理工具 npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
- es6模板字符串使用使${} 来包裹一个变量或者一个表达式
es6模板字符串使用使${} 来包裹一个变量或者一个表达式 2019-04-28 14:33:54 Gabriel_wei 阅读数 1774 收藏 更多 分类专栏: 前端 版权声明:本文为博主原 ...
- k8s 使本地集群支持 LoadBalancer 服务
k8s 使本地集群支持 LoadBalancer 服务 为了使本地集群支持 LoadBalancer 服务,可以参考以下两种实现方案: keepalived-cloud-provider metalL ...
- 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 ...
随机推荐
- ClickHouse元数据异常-MySQLHandlerFactory:Failed to read RSA key pair from server
Clickhouse版本:20.3.6.40-2 clickhouse集群三个节点,一分片,三副本,三个节点数据完全一样 1. 问题描述 在使用连接工具操作时,发现其中一个节点连接拒绝,无法操作,另外 ...
- Lzzy高级语言程序设计之for循环
public class Mq { public static void main(String[]args){ int a = 3 ; a++;// do{ System.out.println(& ...
- dfs求连通块
递归 递归是什么?绝大部分人都会说:自己调用自己,刚开始我也是这样理解递归的.确实没错,递归的确是自己调用自己.递归简单的应用:编写一个能计算斐波那契数列的函数,也就是这样: int fb(int n ...
- get和post的区别主要有以下几方面
1.url可见性: get,参数url可见: post,url参数不可见 2.数据传输上: get,通过拼接url进行传递参数: post,通过body体传输参数 3.缓存性: get请求是可以缓存的 ...
- python 集合详解
字符串 一个个字符组成的有序的序列,时字符的集合 使用单引,双引,三引 引住的字符序列 字符时不可变的对象 bytes定义 bytes不可变字节序列 使用b前缀定义 只允许基本ASCII使用字符形式 ...
- python爬去壁纸网站上的所有壁纸
import requests as r 2 from bs4 import BeautifulSoup 3 import os 4 base_url = "http://www.win40 ...
- 安装anaconda和第三方库tushare
安装anaconda和第三方库tushare 血泪教训 下载32位的anaconda(同你Python版本,不然会碰到第三方库无法import的问题) 安装anaconda 安装到C盘会比较快,安装到 ...
- .NET初探源代码生成(Source Generators)
前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值 ...
- 攻防世界 reverse parallel-comparator-200
parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...
- JS基础学习第二天
类型转换 类型转换就是指将其他的数据类型,转换为String Number 或 Boolean 转换为String 方式一(强制类型转换): 调用被转换数据的toString()方法例子:var a ...