Using node.js as a simple web server

后端 未结 30 2090
感情败类
感情败类 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:26

    This is one of the fastest solutions i use to quickly see web pages

    sudo npm install ripple-emulator -g
    

    From then on just enter the directory of your html files and run

    ripple emulate
    

    then change the device to Nexus 7 landscape.

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

    You don't need express. You don't need connect. Node.js does http NATIVELY. All you need to do is return a file dependent on the request:

    var http = require('http')
    var url = require('url')
    var fs = require('fs')
    
    http.createServer(function (request, response) {
        var requestUrl = url.parse(request.url)    
        response.writeHead(200)
        fs.createReadStream(requestUrl.pathname).pipe(response)  // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) 
    }).listen(9615)    
    

    A more full example that ensures requests can't access files underneath a base-directory, and does proper error handling:

    var http = require('http')
    var url = require('url')
    var fs = require('fs')
    var path = require('path')
    var baseDirectory = __dirname   // or whatever base directory you want
    
    var port = 9615
    
    http.createServer(function (request, response) {
        try {
            var requestUrl = url.parse(request.url)
    
            // need to use path.normalize so people can't access directories underneath baseDirectory
            var fsPath = baseDirectory+path.normalize(requestUrl.pathname)
    
            var fileStream = fs.createReadStream(fsPath)
            fileStream.pipe(response)
            fileStream.on('open', function() {
                 response.writeHead(200)
            })
            fileStream.on('error',function(e) {
                 response.writeHead(404)     // assume the file doesn't exist
                 response.end()
            })
       } catch(e) {
            response.writeHead(500)
            response.end()     // end the response so browsers don't hang
            console.log(e.stack)
       }
    }).listen(port)
    
    console.log("listening on port "+port)
    
    0 讨论(0)
  • 2020-11-22 03:27

    The fast way:

    var express = require('express');
    var app = express();
    app.use('/', express.static(__dirname + '/../public')); // ← adjust
    app.listen(3000, function() { console.log('listening'); });
    

    Your way:

    var http = require('http');
    var fs = require('fs');
    
    http.createServer(function (req, res) {
        console.dir(req.url);
    
        // will get you  '/' or 'index.html' or 'css/styles.css' ...
        // • you need to isolate extension
        // • have a small mimetype lookup array/object
        // • only there and then reading the file
        // •  delivering it after setting the right content type
    
        res.writeHead(200, {'Content-Type': 'text/html'});
    
        res.end('ok');
    }).listen(3001);
    
    0 讨论(0)
  • 2020-11-22 03:28

    Crazy amount of complicated answers here. If you don't intend to process nodeJS files/database but just want to serve static html/css/js/images as your question suggest then simply install the pushstate-server module or similar;

    Here's a "one liner" that will create and launch a mini site. Simply paste that entire block in your terminal in the appropriate directory.

    mkdir mysite; \
    cd mysite; \
    npm install pushstate-server --save; \
    mkdir app; \
    touch app/index.html; \
    echo '<h1>Hello World</h1>' > app/index.html; \
    touch server.js; \
    echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './app' });" > server.js; \
    node server.js
    

    Open browser and go to http://localhost:3000. Done.

    The server will use the app dir as the root to serve files from. To add additional assets just place them inside that directory.

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

    local-web-server is definitely worth a look! Here's an excerpt from the readme:

    local-web-server

    A lean, modular web server for rapid full-stack development.

    • Supports HTTP, HTTPS and HTTP2.
    • Small and 100% personalisable. Load and use only the behaviour required by your project.
    • Attach a custom view to personalise how activity is visualised.
    • Programmatic and command-line interfaces.

    Use this tool to:

    • Build any type of front-end web application (static, dynamic, Single Page App, Progessive Web App, React etc).
    • Prototype a back-end service (REST API, microservice, websocket, Server Sent Events service etc).
    • Monitor activity, analyse performance, experiment with caching strategy etc.

    Local-web-server is a distribution of lws bundled with a "starter pack" of useful middleware.

    Synopsis

    This package installs the ws command-line tool (take a look at the usage guide).

    Static web site

    Running ws without any arguments will host the current directory as a static web site. Navigating to the server will render a directory listing or your index.html, if that file exists.

    $ ws
    Listening on http://mbp.local:8000, http://127.0.0.1:8000, http://192.168.0.100:8000
    

    Static files tutorial.

    This clip demonstrates static hosting plus a couple of log output formats - dev and stats.

    Single Page Application

    Serving a Single Page Application (an app with client-side routing, e.g. a React or Angular app) is as trivial as specifying the name of your single page:

    $ ws --spa index.html
    

    With a static site, requests for typical SPA paths (e.g. /user/1, /login) would return 404 Not Found as a file at that location does not exist. However, by marking index.html as the SPA you create this rule:

    If a static file is requested (e.g. /css/style.css) then serve it, if not (e.g. /login) then serve the specified SPA and handle the route client-side.

    SPA tutorial.

    URL rewriting and proxied requests

    Another common use case is to forward certain requests to a remote server.

    The following command proxies blog post requests from any path beginning with /posts/ to https://jsonplaceholder.typicode.com/posts/. For example, a request for /posts/1 would be proxied to https://jsonplaceholder.typicode.com/posts/1.

    $ ws --rewrite '/posts/(.*) -> https://jsonplaceholder.typicode.com/posts/$1'
    

    Rewrite tutorial.

    This clip demonstrates the above plus use of --static.extensions to specify a default file extension and --verbose to monitor activity.

    HTTPS and HTTP2

    For HTTPS or HTTP2, pass the --https or --http2 flags respectively. See the wiki for further configuration options and a guide on how to get the "green padlock" in your browser.

    $ lws --http2
    Listening at https://mba4.local:8000, https://127.0.0.1:8000, https://192.168.0.200:8000
    
    0 讨论(0)
  • 2020-11-22 03:30

    Rather than dealing with a switch statement, I think it's neater to lookup the content type from a dictionary:

    var contentTypesByExtension = {
        'html': "text/html",
        'js':   "text/javascript"
    };
    
    ...
    
        var contentType = contentTypesByExtension[fileExtension] || 'text/plain';
    
    0 讨论(0)
提交回复
热议问题