{"id":22419977,"url":"https://github.com/nim579/node-srv","last_synced_at":"2025-10-19T18:04:03.368Z","repository":{"id":492058,"uuid":"12865564","full_name":"nim579/node-srv","owner":"nim579","description":"Simple static node.js server","archived":false,"fork":false,"pushed_at":"2021-05-11T07:07:55.000Z","size":67,"stargazers_count":5,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-11T20:26:02.009Z","etag":null,"topics":["coffeescript","extend-server","node-srv","promise","server","static-server"],"latest_commit_sha":null,"homepage":null,"language":"CoffeeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nim579.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-09-16T11:25:44.000Z","updated_at":"2021-09-02T08:59:11.000Z","dependencies_parsed_at":"2022-08-06T09:15:30.421Z","dependency_job_id":null,"html_url":"https://github.com/nim579/node-srv","commit_stats":{"total_commits":54,"total_committers":7,"mean_commits":7.714285714285714,"dds":0.5,"last_synced_commit":"0f7c5565ff52618cc6629eada23cb18bd8eb7f83"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nim579%2Fnode-srv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nim579%2Fnode-srv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nim579%2Fnode-srv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nim579%2Fnode-srv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nim579","download_url":"https://codeload.github.com/nim579/node-srv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228330026,"owners_count":17903019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coffeescript","extend-server","node-srv","promise","server","static-server"],"created_at":"2024-12-05T16:17:17.855Z","updated_at":"2025-10-06T20:05:32.019Z","avatar_url":"https://github.com/nim579.png","language":"CoffeeScript","readme":"# Node-srv [![](https://badge.fury.io/js/node-srv.png)](https://npmjs.org/package/node-srv)\nSimple fast and static node.js server\n\n## Install\n\n``` bash\n$ npm install -g node-srv\n```\n\n\n## Usage\n\n``` bash\n# Start server on port 8000 in current dir\n$ node-srv\n\n# Start server on port 8000 in parent dir\n$ node-srv ..\n\n# Start server on port 8001 writing logs to *./nodeserver.log* file\n$ node-srv --port 8001 --logs ./nodeserver.log\n```\n\n\n## API usage\n\n`new Server(options, routes, handlers, exitCallback);`\n\n``` js\n// Require module\nvar server = require('node-srv');\n\n// Start server\nvar srv = new Server({\n    port: 5000,\n    root: '../www/',\n    logs: true\n});\n\n// Update server port (automatically restert server with new port)\nsrv.options.port = 5001;\n\n// Stop server\nsrv.stop();\n```\n\n\n## Options\n\n* **-p, --port [number]**, `port` — Port the server is started on (default `8000`, or env PORT)\n* **-h, --host [host]**, `host` — Host or ip address on which the server will work (any host `0.0.0.0` by default)\n* **-i, --index [file]**, `index` — Sets default index file for directories. For example: for uri `/test/`, server open `test/index.html`. Default `index.html`\n* **-l, --logs [path/boolean]**, `logs` — Write logs flag. If you specify a path, it will write to that file (if path is folder, default filename will be node-srv.log). Default `false`\n* **-t, --timeout [ms]**, `timeout` — Requset timeout (in ms). Default `30000`\n* **-s, --https [boolean]**, `https` — Force create HTTPS server (only with `--key` and `--cert` options). Default `false`\n* **--key [path]**, `key` — Path to key file for https server\n* **--cert [path]**, `cert` — Path to certificate file for https server\n* **--cors [hosts]**, `cors` — Enable CORS. If empty uses `*` for host. Default `false`\n* **--not-found [path]**, `notFound` — Path to 404 error page. Default `null`\n* **--help** — print help\n* **--version** — print version\n\n\n## Usage as [Grunt.js](http://gruntjs.com/) task\n1. Install **node-srv** locally\n\n  ``` bash\n  $ npm i node-srv\n  ```\n\n2. Load task into your **Gruntfile**\n\n  ``` js\n  grunt.loadTasks('node-srv');\n  ```\n\n3. Configure as multitask\n\n  ``` js\n  grunt.initConfig({\n      srv: {\n          server1: {\n              port: 4001,\n              '404': './404.html'\n              index: 'index.htm',\n              keepalive: false\n          },\n          server2: {\n              port: 4002,\n              logs: true\n          },\n      }\n  });\n  ```\n\n4. Run task\n\n  ``` bash\n  $ grunt srv:server2\n  ```\n\n\n## Extending server\nYou can extend server class.\n\n``` js\nconst Server = require('node-srv');\n\nclass MyServer extends Server {\n    log(string) {\n        console.log(string);\n    }\n}\n```\n\n\n## Handlers\n\nYou can add custom handlres specific path patterns (like [minimatch](https://www.npmjs.com/package/minimatch)).\n\nParameters way:\n``` js\nconst Server = require('node-srv');\n\nnew Server({\n    // options\n    port: 8000\n}, {\n    // routes\n    '**/*.md': 'markdown', // handler name for handlers list\n    '_healthcheck': (params, resolve) =\u003e { // direct handler function\n        resolve({\n            body: `OK: ${params.method} ${params.uri}`, // \"OK: GET /_healthcheck\"\n            code: 200,\n            headers: {'Content-Type': 'text/plain'}\n        });\n    }\n}, {\n    markdown: (params, resolve, reject) =\u003e { // handlers key-value list\n        markdown.renderFile(params.file).then( html =\u003e {\n            resolve({\n                body: html,\n                code: 200,\n                headers: {'Content-Type': 'text/html'}\n            }, (error) =\u003e {\n                if (error.code === 'ENOENT') {\n                    reject({handler: 'notFound'});\n                } else {\n                    reject({error});\n                }\n            });\n        });\n    }\n});\n```\n\nExtend way:\n``` js\nconst Server = require('node-srv');\n\nclass MyServer extends Server {\n    routes() {\n        return {\n            '**/*.md': 'markdown',\n            '_healthcheck': (params, resolve) =\u003e {\n                ... // as in parameters\n            }\n        };\n    }\n    handlers() {\n        return {\n            markdown: (params, resolve, reject) =\u003e {\n                ... // as in parameters\n            }\n        }\n    }\n}\n\nnew MyServer();\n```\n\nYou can return HTTP code or Promise object (and resolve HTTP code).\n\nDefault handlers:\n* **file** — response file\n* **notFound** — response error 404 page (default or optional)\n* **timeout** — response timeout page (by default on request timeout)\n* **serverError** — response error 500 page. Define error code by `reject({code: 403})` and page will return that.\n* **options** — response for OPTIONS request method (CORS)\n\nYou can override its with any way.\n\n\n## Breaking changes from 2.x to 3.x\n\nCLI options:\n* **-r, --root** removed. Use arguments: old `node-srv --root ../web`, new `node-srv ../web`\n* **--404** renamed to **--not-found**\n* **-k** shortcut removed from **--key**. Use only full flag\n* **-c** shortcut removed from **--cert**. Use only full flag\n\nProgram API:\n* class arguments changed\n* handlers architecture changed\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnim579%2Fnode-srv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnim579%2Fnode-srv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnim579%2Fnode-srv/lists"}