node

node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
javascript/jQuery

javascript/jQuery

一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。
MongoDB

MongoDB

MongoDB 是一个基于分布式文件存储的数据库
openstack

openstack

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。
VUE

VUE

一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。
bootstrap

bootstrap

Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web.
HTML

HTML

超文本标记语言,标准通用标记语言下的一个应用。
CSS/SASS/SCSS/Less

CSS/SASS/SCSS/Less

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
PHP

PHP

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执
每天进步一点点

每天进步一点点

乌法把门的各累笑寂静
求职招聘

求职招聘

猎头招聘专用栏目
Python

Python

一种解释型、面向对象、动态数据类型的高级程序设计语言。

queries 分离函数 适用 mongoose

lopo1983 发表了文章 • 0 个评论 • 1016 次浏览 • 2018-10-17 21:34 • 来自相关话题

? // app/extend/helper.js
/**
* GET querys 分离函数
* @param {String} pages 分页 [上一页最后一个数据的_id,分页数量] 分页数量默认为10
* @param {String} fields 需要展示的字段 a,b,c,d
* @param {String} unFields 不需要展示的字段 a,b,c,d
* @param {String} querys 查询条件 如 a=1&b=2&c=3
* @param {String} orderBy 排序字段
* @param {String} sort 排序方式【1:正序,-1:倒序】(必须与prderBy同时出现)
* @param {String} dates 时间范围/时间查询 [开始时间,结束时间]/查询时间
*
* @version 1.0.1
* 2018/10/17 修改返回值类型可直接供mongoose使用
*
* @example
* GET /user/?orderBy=compName&sort=-1&pages=20,1&fields=compName,compAuth,compEmail&unFields=status&dates=2018-8-5&name=lopo
* @return {Object}
* {
* querys: { name: 'lopo' },
* select: { compName: 1, compAuth: 1, compEmail: 1, status: 0 },
* pages: { marker: '1', limit: '20' },
* sort: { compName: '-1' },
* dates: '2018-8-5'
* }
*/
queryParamFn(querys) {
const mapFN = (str) => (field, val) => str[field].split(',').reduce((a, b) => { a<strong> = val; return a }, {});
let strToArr = mapFN(querys);
const pages = !!querys.pages && querys.pages;
const orderBy = !!querys.orderBy && querys.orderBy;
const sort = !!querys.sort && querys.sort;
const dates = !!querys.dates && querys.dates;
const fields = !!querys.fields ? strToArr('fields', 1) : {};
const unFields = !!querys.unFields ? strToArr('unFields', 0) : {};
const dateFn = () => {
if (!!dates) {
const ARR = dates.split(',');
return ARR.length === 2 ? { '$gte': ARR[1], '$lte': ARR[0] } : `${ARR}`
}
}
const sortFn = () => {
let OBJ = {};
if (!!orderBy) {
OBJ[orderBy] = sort;
return OBJ
}
return OBJ || {}
}
delete querys.pages;
delete querys.fields;
delete querys.unFields;
delete querys.orderBy;
delete querys.sort;
delete querys.dates;
return {
'querys': querys || {},
'select': { ...fields, ...unFields },
...(!!pages && {
'pages': {
'marker': pages.split(',')[1] || undefined,
'limit': pages.split(',')[0] || 10
}
}),
...!!orderBy && {
'sort': sortFn()
},
...!!dates && {
'dates': dateFn()
}
}
} 查看全部
?
    // app/extend/helper.js
/**
* GET querys 分离函数
* @param {String} pages 分页 [上一页最后一个数据的_id,分页数量] 分页数量默认为10
* @param {String} fields 需要展示的字段 a,b,c,d
* @param {String} unFields 不需要展示的字段 a,b,c,d
* @param {String} querys 查询条件 如 a=1&b=2&c=3
* @param {String} orderBy 排序字段
* @param {String} sort 排序方式【1:正序,-1:倒序】(必须与prderBy同时出现)
* @param {String} dates 时间范围/时间查询 [开始时间,结束时间]/查询时间
*
* @version 1.0.1
* 2018/10/17 修改返回值类型可直接供mongoose使用
*
* @example
* GET /user/?orderBy=compName&sort=-1&pages=20,1&fields=compName,compAuth,compEmail&unFields=status&dates=2018-8-5&name=lopo
* @return {Object}
* {
* querys: { name: 'lopo' },
* select: { compName: 1, compAuth: 1, compEmail: 1, status: 0 },
* pages: { marker: '1', limit: '20' },
* sort: { compName: '-1' },
* dates: '2018-8-5'
* }
*/
queryParamFn(querys) {
const mapFN = (str) => (field, val) => str[field].split(',').reduce((a, b) => { a<strong> = val; return a }, {});
let strToArr = mapFN(querys);
const pages = !!querys.pages && querys.pages;
const orderBy = !!querys.orderBy && querys.orderBy;
const sort = !!querys.sort && querys.sort;
const dates = !!querys.dates && querys.dates;
const fields = !!querys.fields ? strToArr('fields', 1) : {};
const unFields = !!querys.unFields ? strToArr('unFields', 0) : {};
const dateFn = () => {
if (!!dates) {
const ARR = dates.split(',');
return ARR.length === 2 ? { '$gte': ARR[1], '$lte': ARR[0] } : `${ARR}`
}
}
const sortFn = () => {
let OBJ = {};
if (!!orderBy) {
OBJ[orderBy] = sort;
return OBJ
}
return OBJ || {}
}
delete querys.pages;
delete querys.fields;
delete querys.unFields;
delete querys.orderBy;
delete querys.sort;
delete querys.dates;
return {
'querys': querys || {},
'select': { ...fields, ...unFields },
...(!!pages && {
'pages': {
'marker': pages.split(',')[1] || undefined,
'limit': pages.split(',')[0] || 10
}
}),
...!!orderBy && {
'sort': sortFn()
},
...!!dates && {
'dates': dateFn()
}
}
}

http 错误代码表

lopo1983 发表了文章 • 0 个评论 • 1028 次浏览 • 2017-12-18 12:01 • 来自相关话题

所有 HTTP 状态代码及其定义。?
代码??指示??
2xx??成功??
200??正常;请求已完成。??
201??正常;紧接 POST 命令。??
202??正常;已接受用于处理,但处理尚未完成。??
203??正常;部分信息 — 返回的信息只是一部分。??
204??正常;无响应 — 已接收请求,但不存在要回送的信息。??
3xx??重定向??
301??已移动 — 请求的数据具有新的位置且更改是永久的。??
302??已找到 — 请求的数据临时具有不同 URI。??
303??请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。??
304??未修改 — 未按预期修改文档。??
305??使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。??
306??未使用 — 不再使用;保留此代码以便将来使用。??
4xx??客户机中出现的错误??
400??错误请求 — 请求中有语法问题,或不能满足请求。??
401??未授权 — 未授权客户机访问数据。??
402??需要付款 — 表示计费系统已有效。??
403??禁止 — 即使有授权也不需要访问。??
404??找不到 — 万博manbetx手机在线登录网址找不到给定的资源;文档不存在。??
407??代理认证请求 — 客户机首先必须使用代理认证自身。??
415??介质类型不受支持 — 万博manbetx手机在线登录网址拒绝服务请求,因为不支持请求实体的格式。??
5xx??万博manbetx手机在线登录网址中出现的错误??
500??内部错误 — 因为意外情况,万博manbetx手机在线登录网址不能完成请求。??
501??未执行 — 万博manbetx手机在线登录网址不支持请求的工具。??
502??错误网关 — 万博manbetx手机在线登录网址接收到来自上游万博manbetx手机在线登录网址的无效响应。??
503??无法获得服务 — 由于临时过载或维护,万博manbetx手机在线登录网址无法处理请求。
?
--------------------------------------------------------------------------------------------------------
?
HTTP?400?-?请求无效?
HTTP?401.1?-?未授权:登录失败?
HTTP?401.2?-?未授权:万博manbetx手机在线登录网址配置问题导致登录失败?
HTTP?401.3?-?ACL?禁止访问资源?
HTTP?401.4?-?未授权:授权被筛选器拒绝?
HTTP?401.5?-?未授权:ISAPI?或?CGI?授权失败??
HTTP?403?-?禁止访问?
HTTP?403?-?对?Internet?服务管理器?(HTML)?的访问仅限于?Localhost?
HTTP?403.1?禁止访问:禁止可执行访问?
HTTP?403.2?-?禁止访问:禁止读访问?
HTTP?403.3?-?禁止访问:禁止写访问?
HTTP?403.4?-?禁止访问:要求?SSL?
HTTP?403.5?-?禁止访问:要求?SSL?128?
HTTP?403.6?-?禁止访问:IP?地址被拒绝?
HTTP?403.7?-?禁止访问:要求客户证书?
HTTP?403.8?-?禁止访问:禁止站点访问?
HTTP?403.9?-?禁止访问:连接的用户过多?
HTTP?403.10?-?禁止访问:配置无效?
HTTP?403.11?-?禁止访问:密码更改?
HTTP?403.12?-?禁止访问:映射器拒绝访问?
HTTP?403.13?-?禁止访问:客户证书已被吊销?
HTTP?403.15?-?禁止访问:客户访问许可过多?
HTTP?403.16?-?禁止访问:客户证书不可信或者无效?
HTTP?403.17?-?禁止访问:客户证书已经到期或者尚未生效?
HTTP?404.1?-?无法找到?Web?站点?
HTTP?404?-?无法找到文件?
HTTP?405?-?资源被禁止?
HTTP?406?-?无法接受?
HTTP?407?-?要求代理身份验证?
HTTP?410?-?永远不可用?
HTTP?412?-?先决条件失败?
HTTP?414?-?请求?-?URI?太长?
HTTP?500?-?内部万博manbetx手机在线登录网址错误?
HTTP?500.100?-?内部万博manbetx手机在线登录网址错误?-?ASP?错误?
HTTP?500-11?万博manbetx手机在线登录网址关闭?
HTTP?500-12?应用程序重新启动?
HTTP?500-13?-?万博manbetx手机在线登录网址太忙?
HTTP?500-14?-?应用程序无效?
HTTP?500-15?-?不允许请求?global.asa?
Error?501?-?未实现?
HTTP?502?-?网关错误? 查看全部
所有 HTTP 状态代码及其定义。?
代码??指示??
2xx??成功??
200??正常;请求已完成。??
201??正常;紧接 POST 命令。??
202??正常;已接受用于处理,但处理尚未完成。??
203??正常;部分信息 — 返回的信息只是一部分。??
204??正常;无响应 — 已接收请求,但不存在要回送的信息。??
3xx??重定向??
301??已移动 — 请求的数据具有新的位置且更改是永久的。??
302??已找到 — 请求的数据临时具有不同 URI。??
303??请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。??
304??未修改 — 未按预期修改文档。??
305??使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。??
306??未使用 — 不再使用;保留此代码以便将来使用。??
4xx??客户机中出现的错误??
400??错误请求 — 请求中有语法问题,或不能满足请求。??
401??未授权 — 未授权客户机访问数据。??
402??需要付款 — 表示计费系统已有效。??
403??禁止 — 即使有授权也不需要访问。??
404??找不到 — 万博manbetx手机在线登录网址找不到给定的资源;文档不存在。??
407??代理认证请求 — 客户机首先必须使用代理认证自身。??
415??介质类型不受支持 — 万博manbetx手机在线登录网址拒绝服务请求,因为不支持请求实体的格式。??
5xx??万博manbetx手机在线登录网址中出现的错误??
500??内部错误 — 因为意外情况,万博manbetx手机在线登录网址不能完成请求。??
501??未执行 — 万博manbetx手机在线登录网址不支持请求的工具。??
502??错误网关 — 万博manbetx手机在线登录网址接收到来自上游万博manbetx手机在线登录网址的无效响应。??
503??无法获得服务 — 由于临时过载或维护,万博manbetx手机在线登录网址无法处理请求。
?
--------------------------------------------------------------------------------------------------------
?
HTTP?400?-?请求无效?
HTTP?401.1?-?未授权:登录失败?
HTTP?401.2?-?未授权:万博manbetx手机在线登录网址配置问题导致登录失败?
HTTP?401.3?-?ACL?禁止访问资源?
HTTP?401.4?-?未授权:授权被筛选器拒绝?
HTTP?401.5?-?未授权:ISAPI?或?CGI?授权失败??
HTTP?403?-?禁止访问?
HTTP?403?-?对?Internet?服务管理器?(HTML)?的访问仅限于?Localhost?
HTTP?403.1?禁止访问:禁止可执行访问?
HTTP?403.2?-?禁止访问:禁止读访问?
HTTP?403.3?-?禁止访问:禁止写访问?
HTTP?403.4?-?禁止访问:要求?SSL?
HTTP?403.5?-?禁止访问:要求?SSL?128?
HTTP?403.6?-?禁止访问:IP?地址被拒绝?
HTTP?403.7?-?禁止访问:要求客户证书?
HTTP?403.8?-?禁止访问:禁止站点访问?
HTTP?403.9?-?禁止访问:连接的用户过多?
HTTP?403.10?-?禁止访问:配置无效?
HTTP?403.11?-?禁止访问:密码更改?
HTTP?403.12?-?禁止访问:映射器拒绝访问?
HTTP?403.13?-?禁止访问:客户证书已被吊销?
HTTP?403.15?-?禁止访问:客户访问许可过多?
HTTP?403.16?-?禁止访问:客户证书不可信或者无效?
HTTP?403.17?-?禁止访问:客户证书已经到期或者尚未生效?
HTTP?404.1?-?无法找到?Web?站点?
HTTP?404?-?无法找到文件?
HTTP?405?-?资源被禁止?
HTTP?406?-?无法接受?
HTTP?407?-?要求代理身份验证?
HTTP?410?-?永远不可用?
HTTP?412?-?先决条件失败?
HTTP?414?-?请求?-?URI?太长?
HTTP?500?-?内部万博manbetx手机在线登录网址错误?
HTTP?500.100?-?内部万博manbetx手机在线登录网址错误?-?ASP?错误?
HTTP?500-11?万博manbetx手机在线登录网址关闭?
HTTP?500-12?应用程序重新启动?
HTTP?500-13?-?万博manbetx手机在线登录网址太忙?
HTTP?500-14?-?应用程序无效?
HTTP?500-15?-?不允许请求?global.asa?
Error?501?-?未实现?
HTTP?502?-?网关错误?

express express-jwt(token)简单使用案例

lopo1983 发表了文章 • 0 个评论 • 2902 次浏览 • 2017-10-07 01:02 • 来自相关话题

配置jwt (app.js)var expressJwt = require("express-jwt");
// jwt中间件
app.use(expressJwt({
secret: "yousecret"//加密密钥,可换
}).unless({
path: ["/api/login","/api/addUser","/api/test"]//添加不需要token验证的路由
}));生成token? promise化 dao.query(UserSQL.isName, paramA).then(result => {
user = result[0];
if(cryptPwd(param.password, user.salt)[1] === user.password) {
let authToken = jwt.sign({
name: user.userName,
password: user.password,
group: user.group,
salt: '123'
}, "secret", {
expiresIn: "10 days"
});
res.json({
code: 200,
msg: '登录成功',
token: authToken
});
} else {
res.json({
code: 250,
msg: '用户名或密码不正确'
})
};
}) 查看全部
配置jwt (app.js)
var expressJwt = require("express-jwt");
// jwt中间件
app.use(expressJwt({
secret: "yousecret"//加密密钥,可换
}).unless({
path: ["/api/login","/api/addUser","/api/test"]//添加不需要token验证的路由
}));
生成token? promise化
      dao.query(UserSQL.isName, paramA).then(result => {
user = result[0];
if(cryptPwd(param.password, user.salt)[1] === user.password) {
let authToken = jwt.sign({
name: user.userName,
password: user.password,
group: user.group,
salt: '123'
}, "secret", {
expiresIn: "10 days"
});
res.json({
code: 200,
msg: '登录成功',
token: authToken
});
} else {
res.json({
code: 250,
msg: '用户名或密码不正确'
})
};
})

promise 化mysqljs

lopo1983 发表了文章 • 0 个评论 • 1166 次浏览 • 2017-10-02 07:02 • 来自相关话题

感谢戏子大爷
// 导入MySQL模块
const mysql = require('mysql');
const dbConfig = require('../db/DBConfig');
// 使用DBConfig.js的配置信息创建一个MySQL连接池
const pool = mysql.createPool(dbConfig.mysql);
module.exports = {
query: function (sql,args = []) {
return new Promise((resolve, reject) => {
// 获取数据库连接
pool.getConnection((err, connection) => {
if (err) {
// 错误返回- 自己可以另外带参数,判断错误类型
reject(err)
} else {
// 执行数据查询
connection.query(sql, args, (err, res) => {
if (err) {
// 错误返回- 自己可以另外带参数,判断错误类型
reject(err)
} else {
// 查询成功
resolve(res);
}
})
}
})
})
}
} 查看全部

感谢戏子大爷


// 导入MySQL模块
const mysql = require('mysql');
const dbConfig = require('../db/DBConfig');
// 使用DBConfig.js的配置信息创建一个MySQL连接池
const pool = mysql.createPool(dbConfig.mysql);
module.exports = {
query: function (sql,args = []) {
return new Promise((resolve, reject) => {
// 获取数据库连接
pool.getConnection((err, connection) => {
if (err) {
// 错误返回- 自己可以另外带参数,判断错误类型
reject(err)
} else {
// 执行数据查询
connection.query(sql, args, (err, res) => {
if (err) {
// 错误返回- 自己可以另外带参数,判断错误类型
reject(err)
} else {
// 查询成功
resolve(res);
}
})
}
})
})
}
}

promise 化 jsonwebtoken

lopo1983 发表了文章 • 0 个评论 • 1154 次浏览 • 2017-10-02 07:00 • 来自相关话题

const jwt = require('jsonwebtoken')

exports._jwt = jwt

exports.sign = (payload, key, opts) => {
opts = opts || {}
return new Promise((resolve, reject) => {
jwt.sign(payload, key, opts, (err, token) => {
if (err || !token) return reject(err)
resolve(token)
})
})
}

exports.verify = (token, key, opts) => {
opts = opts || {}
return new Promise((resolve, reject) => {
jwt.verify(token, key, opts, (err, verified) => {
if (err) return reject(err)
resolve(verified)
})
})
} 查看全部
const jwt = require('jsonwebtoken')

exports._jwt = jwt

exports.sign = (payload, key, opts) => {
opts = opts || {}
return new Promise((resolve, reject) => {
jwt.sign(payload, key, opts, (err, token) => {
if (err || !token) return reject(err)
resolve(token)
})
})
}

exports.verify = (token, key, opts) => {
opts = opts || {}
return new Promise((resolve, reject) => {
jwt.verify(token, key, opts, (err, verified) => {
if (err) return reject(err)
resolve(verified)
})
})
}

basicSQL

lopo1983 发表了文章 • 0 个评论 • 1127 次浏览 • 2017-09-28 04:02 • 来自相关话题

module.exports = {
queryAll(db, limit = '') {
return 'SELECT * FROM ' + db + ' limit ' + limit
},
insertAll(db, num) {
return 'INSERT INTO ' + db + ' VALUES ("id",' + Array(num).fill('?').join() + ')'
},
delAll(db, id) {
return 'DELETE FROM ' + db + ' WHERE id=' + id
},
next(db, id, num) {
return 'select * from ' + db + 'where' + id + ' = (select max(' + id + ') from ' + db + ' where ' + id + ' < ' + num + ' )'
},
prev(db, id, num) {
return 'select * from ' + db + 'where' + id + ' = (select min(' + id + ') from ' + db + ' where ' + id + ' > ' + num + ' )'
},
insertOnly(db,num){
return 'insert ignore '+db+ ' VALUES ("id",' + Array(num).fill('?').join() + ')'
}
}
数据库名为dbname,表名table,字段名fieldname.
ALTER TABLE dbname.table ADD UNIQUE (fieldname); 查看全部
module.exports = {
queryAll(db, limit = '') {
return 'SELECT * FROM ' + db + ' limit ' + limit
},
insertAll(db, num) {
return 'INSERT INTO ' + db + ' VALUES ("id",' + Array(num).fill('?').join() + ')'
},
delAll(db, id) {
return 'DELETE FROM ' + db + ' WHERE id=' + id
},
next(db, id, num) {
return 'select * from ' + db + 'where' + id + ' = (select max(' + id + ') from ' + db + ' where ' + id + ' < ' + num + ' )'
},
prev(db, id, num) {
return 'select * from ' + db + 'where' + id + ' = (select min(' + id + ') from ' + db + ' where ' + id + ' > ' + num + ' )'
},
insertOnly(db,num){
return 'insert ignore '+db+ ' VALUES ("id",' + Array(num).fill('?').join() + ')'
}
}

数据库名为dbname,表名table,字段名fieldname.


ALTER TABLE dbname.table ADD UNIQUE (fieldname);