Using node.js as a simple web server

后端 未结 30 2187
感情败类
感情败类 2020-11-22 02:54

I want to run a very simple HTTP server. Every GET request to example.com should get index.html served to it but as a regular HTML page (i.e., same

相关标签:
30条回答
  • 2020-11-22 03:20

    from w3schools

    it is pretty easy to create a node server to serve any file that is requested, and you dont need to install any packages for it

    var http = require('http');
    var url = require('url');
    var fs = require('fs');
    
    http.createServer(function (req, res) {
      var q = url.parse(req.url, true);
      var filename = "." + q.pathname;
      fs.readFile(filename, function(err, data) {
        if (err) {
          res.writeHead(404, {'Content-Type': 'text/html'});
          return res.end("404 Not Found");
        }  
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(data);
        return res.end();
      });
    }).listen(8080);
    

    http://localhost:8080/file.html

    will serve file.html from disk

    0 讨论(0)
  • 2020-11-22 03:21

    I think the part you're missing right now is that you're sending:

    Content-Type: text/plain
    

    If you want a web browser to render the HTML, you should change this to:

    Content-Type: text/html
    
    0 讨论(0)
  • 2020-11-22 03:22

    Simplest Node.js server is just:

    $ npm install http-server -g
    

    Now you can run a server via the following commands:

    $ cd MyApp
    
    $ http-server
    

    If you're using NPM 5.2.0 or newer, you can use http-server without installing it with npx. This isn't recommended for use in production but is a great way to quickly get a server running on localhost.

    $ npx http-server
    

    Or, you can try this, which opens your web browser and enables CORS requests:

    $ http-server -o --cors
    

    For more options, check out the documentation for http-server on GitHub, or run:

    $ http-server --help
    

    Lots of other nice features and brain-dead-simple deployment to NodeJitsu.

    Feature Forks

    Of course, you can easily top up the features with your own fork. You might find it's already been done in one of the existing 800+ forks of this project:

    • https://github.com/nodeapps/http-server/network

    Light Server: An Auto Refreshing Alternative

    A nice alternative to http-server is light-server. It supports file watching and auto-refreshing and many other features.

    $ npm install -g light-server 
    $ light-server
    

    Add to your directory context menu in Windows Explorer

     reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d "\"C:\nodejs\light-server.cmd\" \"-o\" \"-s\" \"%V\""
    

    Simple JSON REST server

    If you need to create a simple REST server for a prototype project then json-server might be what you're looking for.

    Auto Refreshing Editors

    Most web page editors and IDE tools now include a web server that will watch your source files and auto refresh your web page when they change.

    I use Live Server with Visual Studio Code.

    The open source text editor Brackets also includes a NodeJS static web server. Just open any HTML file in Brackets, press "Live Preview" and it starts a static server and opens your browser at the page. The browser will **auto refresh whenever you edit and save the HTML file. This especially useful when testing adaptive web sites. Open your HTML page on multiple browsers/window sizes/devices. Save your HTML page and instantly see if your adaptive stuff is working as they all auto refresh.

    PhoneGap Developers

    If you're coding a hybrid mobile app, you may be interested to know that the PhoneGap team took this auto refresh concept on board with their new PhoneGap App. This is a generic mobile app that can load the HTML5 files from a server during development. This is a very slick trick since now you can skip the slow compile/deploy steps in your development cycle for hybrid mobile apps if you're changing JS/CSS/HTML files — which is what you're doing most of the time. They also provide the static NodeJS web server (run phonegap serve) that detects file changes.

    PhoneGap + Sencha Touch Developers

    I've now extensively adapted the PhoneGap static server & PhoneGap Developer App for Sencha Touch & jQuery Mobile developers. Check it out at Sencha Touch Live. Supports --qr QR Codes and --localtunnel that proxies your static server from your desktop computer to a URL outside your firewall! Tons of uses. Massive speedup for hybrid mobile devs.

    Cordova + Ionic Framework Developers

    Local server and auto refresh features are baked into the ionic tool. Just run ionic serve from your app folder. Even better ... ionic serve --lab to view auto-refreshing side by side views of both iOS and Android.

    0 讨论(0)
  • 2020-11-22 03:22

    I found a interesting library on npm that might be of some use to you. It's called mime(npm install mime or https://github.com/broofa/node-mime) and it can determine the mime type of a file. Here's an example of a webserver I wrote using it:

    var mime = require("mime"),http = require("http"),fs = require("fs");
    http.createServer(function (req, resp) {
    path  = unescape(__dirname + req.url)
    var code = 200
     if(fs.existsSync(path)) {
        if(fs.lstatSync(path).isDirectory()) {
            if(fs.existsSync(path+"index.html")) {
            path += "index.html"
            } else {
                code = 403
                resp.writeHead(code, {"Content-Type": "text/plain"});
                resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
            }
        }
        resp.writeHead(code, {"Content-Type": mime.lookup(path)})
        fs.readFile(path, function (e, r) {
        resp.end(r);
    
    })
    } else {
        code = 404
        resp.writeHead(code, {"Content-Type":"text/plain"});
        resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
    }
    console.log("GET "+code+" "+http.STATUS_CODES[code]+" "+req.url)
    }).listen(9000,"localhost");
    console.log("Listening at http://localhost:9000")
    

    This will serve any regular text or image file (.html, .css, .js, .pdf, .jpg, .png, .m4a and .mp3 are the extensions I've tested, but it theory it should work for everything)

    Developer Notes

    Here is an example of output that I got with it:

    Listening at http://localhost:9000
    GET 200 OK /cloud
    GET 404 Not Found /cloud/favicon.ico
    GET 200 OK /cloud/icon.png
    GET 200 OK /
    GET 200 OK /501.png
    GET 200 OK /cloud/manifest.json
    GET 200 OK /config.log
    GET 200 OK /export1.png
    GET 200 OK /Chrome3DGlasses.pdf
    GET 200 OK /cloud
    GET 200 OK /-1
    GET 200 OK /Delta-Vs_for_inner_Solar_System.svg
    

    Notice the unescape function in the path construction. This is to allow for filenames with spaces and encoded characters.

    0 讨论(0)
  • 2020-11-22 03:24

    Express function sendFile does exactly what you need, and since you want web server functionality from node, express comes as natural choice and then serving static files becomes as easy as :

    res.sendFile('/path_to_your/index.html')
    

    read more here : https://expressjs.com/en/api.html#res.sendFile

    A small example with express web server for node:

    var express = require('express');
    var app = express();
    var path = require('path');
    
    app.get('/', function(req, res) {
        res.sendFile(path.join(__dirname + '/index.html'));
    });
    
    app.listen(8080);
    

    run this, and navigate to http://localhost:8080

    To expand on this to allow you to serve static files like css and images, here's another example :

    var express = require('express');
    var app = express();
    var path = require('path');
    
    app.use(express.static(__dirname + '/css'));
    
    app.get('/', function(req, res) {
        res.sendFile(path.join(__dirname + '/index.html'));
    });
    
    app.listen(8080);
    

    so create a subfolder called css, put your static content in it, and it will be available to your index.html for easy reference like :

    <link type="text/css" rel="stylesheet" href="/css/style.css" />
    

    Notice relative path in href!

    voila!

    0 讨论(0)
  • 2020-11-22 03:26

    if you have node installed on you PC probably you have the NPM, if you don't need NodeJS stuff, you can use the serve package for this:

    1 - Install the package on your PC:

    npm install -g serve
    

    2 - Serve your static folder:

    serve <path> 
    d:> serve d:\StaticSite
    

    It will show you which port your static folder is being served, just navigate to the host like:

    http://localhost:3000
    
    0 讨论(0)
提交回复
热议问题