Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
A http server that return simulation json data.
npm install ohana
You can use a variety data template parser. Recommendation: madoka and mockjs。
var madoka = require("madoka");
var Mock = require('mockjs');
var Server = require("ohana");
// use 'madoka.generate' as default parser
var server = new Server({
parser: madoka.generate
});
// get article parser
server.get('/article/', {
delay: 200,
data: function (params, query) {
console.log(params);
console.log(query);
return [
'{{ repeat(10) }}',
{
'id': '{{ index() }}',
'title': '{{ lorem(1, "sentences") }}',
'author': '{{ firstName() }} {{ lastName() }}',
'brief': '{{ lorem(1, "paragraphs") }}',
'post_time': '{{ date(new Date(2014, 0, 1), "YYYY-MM-dd HH:mm:ss") }}',
'read_count': '{{ integer(100, 10000) }}'
}
];
}
});
// get one article, use mock.js to parse tempate.
server.get('/article/:id', {
parser: Mock.mock,
data: function (params, query) {
return {
"status": "ok",
"data": {
"id": params.id,
"title": "@TITLE(5, 7)",
"author": "@NAME",
"post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",
"content": "@PARAGRAPH(2)",
"poster": "@IMAGE('700x350', '#ccc', '#000', 'hello world')",
"read_count|0-1000": 100
}
}
}
});
// process data before response.
server.get('/user/filter/', {
beforeResponse: function (data) {
return data.data;
},
data: function (params, query) {
return {
'data': [
'{{ repeat(5, 7) }}',
{
'user_name': '{{ firstName() }} {{ lastName() }}'
}
]
}
}
});
// specify content-type
// return 'text/html'
server.get('/user/:id/tag', {
contentType: 'text/html',
beforeResponse: function(data) {
return data.tag;
},
data: {
tag: 'loli'
}
});
server.start(3000);
Server constructor
options
parser
: default parser. Every function like below can use as a parser.function parser(dataTemplate) {
// parse tempate logic
var data = someOperate(dataTemplate);
// return the parsed data.
return data;
}
contentType
: default content-typeonError
: handle errorproxy
: default proxy request config
urlRoot
: the root url of the target servermethod:
request method,GET | POST | PUT | PATCH | DELETEListen a GET request.
path
: url pathoptions
:
parser
: template parserdelay
: delay response. Unit is ms.beforeResponse
: A function process data before responsecontentType
: response content-typestatusCode
: http status codedata
: data template. It can be a function. Function parameter 'params' matching routing parameters, 'query' is submitted or parameter query.server.get('/article/:id', {
data: function (params, query) {
return {
"status": "ok",
"data": {
"id": params.id,
"title": "@TITLE(5, 7)",
"author": "@NAME",
"post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",
"content": "@PARAGRAPH(2)",
"poster": "@IMAGE('700x350', '#ccc', '#000', 'hello world')",
"read_count|0-1000": 100
}
}
}
});
POST request.
DELETE request.
PUT request.
PATCH request.
Proxy request.
path
: url pathoptions
:
urlRoot
: url root of target server,method
: request method,GET | POST | PUT | PATCH | DELETEserver.proxy('/article/:id', {
urlRoot: 'http://localhost:3000',
method: DELETE
});
// global config
var server = new Server({
proxy: {
urlRoot: 'http://localhost:3000',
method: 'get'
}
});
// use global config
server.proxy('/article/');
server.proxy('/article/:id');
server.proxy('/article/', {
method: 'POST'
});
server.proxy('/article/:id', {
method: 'DELETE'
});
server.proxy('/article/:id', {
method: 'PUT'
});
server.proxy('/article/:id', {
method: 'PATCH'
});
register module
apiList
: api module listserver.register([
require('./article/index'),
require('./user/index')
]);
port
host
Basic string:
"/articles" will only match routes that == "/articles".
Named parameters:
"/articles/:title" will only match routes like "/articles/hello", but *not* "/articles/".
Optional named parameters:
"/articles/:title?" will match "/articles/hello" AND "/articles/"
Periods before optional parameters are also optional:
"/:n.:f?" will match "/1" and "/1.json"
Splaaaat! :
"/assets/*" will match "/assets/blah/blah/blah.png" and "/assets/".
"/assets/*.*" will match "/assets/1/2/3.js" as splats: ["1/2/3", "js"]
Mix splat with named parameters:
"/account/:id/assets/*" will match "/account/2/assets/folder.png" as params: {id: 2}, splats:["folder.png"]
Named RegExp:
"/lang/:lang([a-z]{2})" will match "/lang/en" but not "/lang/12" or "/lang/eng"
Raw RegExp:
/^\/(\d{2,3}-\d{2,3}-\d{4})\.(\w*)$/ (note no quotes, this is a RegExp, not a string.) will match "/123-22-1234.json". Each match group will be an entry in splats: ["123-22-1234", "json"]
visit: https://github.com/aaronblohowiak/routes.js
一个返回模拟 json 数据的 http 服务器。
npm install ohana
可以使用多种 json 模板解析器。推荐使用 madoka 和 mockjs。
var madoka = require("madoka");
var Mock = require('mockjs');
var Server = require("ohana");
// 使用 madoka.generate 为默认的解析器,解析数据模板
var server = new Server({
parser: madoka.generate
});
// 获取文章列表
server.get('/article/', {
delay: 200,
data: function (params, query) {
console.log(params);
console.log(query);
return [
'{{ repeat(10) }}',
{
'id': '{{ index() }}',
'title': '{{ lorem(1, "sentences") }}',
'author': '{{ firstName() }} {{ lastName() }}',
'brief': '{{ lorem(1, "paragraphs") }}',
'post_time': '{{ date(new Date(2014, 0, 1), "YYYY-MM-dd HH:mm:ss") }}',
'read_count': '{{ integer(100, 10000) }}'
}
];
}
});
// 获取一篇文章, 使用 mock.js 解析
server.get('/article/:id', {
parser: Mock.mock,
data: function (params, query) {
return {
"status": "ok",
"data": {
"id": params.id,
"title": "@TITLE(5, 7)",
"author": "@NAME",
"post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",
"content": "@PARAGRAPH(2)",
"poster": "@IMAGE('700x350', '#ccc', '#000', 'hello world')",
"read_count|0-1000": 100
}
}
}
});
// 输出数据之前,处理一下数据
server.get('/user/filter/', {
beforeResponse: function (data) {
return data.data;
},
data: function (params, query) {
return {
'data': [
'{{ repeat(5, 7) }}',
{
'user_name': '{{ firstName() }} {{ lastName() }}'
}
]
}
}
});
// 指定输出的 content-type
// 返回 text/html 类型
server.get('/user/:id/tag', {
contentType: 'text/html',
beforeResponse: function(data) {
return data.tag;
},
data: {
tag: 'loli'
}
});
server.start(3000);
Server构造函数
options
parser
: 默认数据模板解析器。任何像以下处理的方法都可以作为解析器function parser(dataTemplate) {
// 解析数据模板的逻辑
var data = someOperate(dataTemplate);
// 返回解析后的数据
return data;
}
contentType
: 默认输出数据的 content-typeonError
: 错误处理proxy
: 代理请求参数
urlRoot
: 目标服务器请求根目录,method:
请求类型,GET | POST | PUT | PATCH | DELETE匹配 GET 方式的请求。
path
: 路由匹配地址options
:
parser
: 数据解析器。delay
: 延迟多少毫秒后返回。beforeResponse
: 数据输出之前处理数据。contentType
: 响应数据的 content-typestatusCode
: http 状态码data
: 返回的数据,可以接受方法, 方法中的参数 params 是路由匹配的参数,query 是提交或查询的参数。server.get('/article/:id', {
data: function (params, query) {
return {
"status": "ok",
"data": {
"id": params.id,
"title": "@TITLE(5, 7)",
"author": "@NAME",
"post_time": "@DATETIME('yyyy-MM-dd HH:mm:ss')",
"content": "@PARAGRAPH(2)",
"poster": "@IMAGE('700x350', '#ccc', '#000', 'hello world')",
"read_count|0-1000": 100
}
}
}
});
与 get 同理
与 get 同理
与 get 同理
与 get 同理
代理请求
path
: 路由匹配地址options
:
urlRoot
: 目标服务器请求根目录,method
: 请求类型,GET | POST | PUT | PATCH | DELETEserver.proxy('/article/:id', {
urlRoot: 'http://localhost:3000',
method: DELETE
});
// 可以设置全局默认配置
var server = new Server({
proxy: {
urlRoot: 'http://localhost:3000',
method: 'get'
}
});
// 之后可以省略配置
server.proxy('/article/');
server.proxy('/article/:id');
server.proxy('/article/', {
method: 'POST'
});
server.proxy('/article/:id', {
method: 'DELETE'
});
server.proxy('/article/:id', {
method: 'PUT'
});
server.proxy('/article/:id', {
method: 'PATCH'
});
注册 api
apiList
: api 模块列表server.register([
require('./article/index'),
require('./user/index')
]);
port
: 服务器监听的网络端口host
: 主机字符串:
"/articles" 只会匹配到 "/articles"。 /articles/ 不会被匹配到。
命名参数:
"/articles/:title" 只会匹配到像"/articles/hello"的路由, 但是不会匹配到 "/articles/".
可选参数:
"/articles/:title?" 匹配 "/articles/hello" 和 "/articles/"。
可选参数前面的参数也是可选的:
"/:n.:f?" 会匹配到 "/1" 和 "/1.json"
星号(splat):
"/assets/*" 匹配到 "/assets/blah/blah/blah.png" 和 "/assets/".
"/assets/*.*" 会匹配到 "/assets/1/2/3.js", 并且有 splats: ["1/2/3", "js"]
星号和命名参数:
"/account/:id/assets/*" 会匹配到 "/account/2/assets/folder.png",并且有 params: {id: 2}, splats:["folder.png"]
正则表达式:
"/lang/:lang([a-z]{2})" 会匹配到 "/lang/en", 但是不会匹配到 "/lang/12" 和 "/lang/eng"
FAQs
A simple server that return fake json data for test
The npm package ohana receives a total of 5 weekly downloads. As such, ohana popularity was classified as not popular.
We found that ohana demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.