1

My app is ready for distribution and I have decided I want to use NodeWebkit. Now, the problem is that my app loads local files and I need a web server for that. How can I package both NodeWebkit and some web server together? If it's impossible to add web server to NodeWebkit, how can I load my files(images,scripts,css) into html? Thanks! :)

setTimeout(function() {
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;

var server = http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));
}, 1000);
McLinux
  • 263
  • 1
  • 10

1 Answers1

1

Node-webkit is basically a combination of node.js and chromium browser. If you want to have your server with your app, you can write a server in node.

Check out Node main documentation

In your package.json

{
  "name": "nw-demo",
  "node-main": "index.js",
  "main": "index.html"
}

mode-main is basically a script that runs in node context and starts as the application starts.

The script will be running in Node's context which won't be destroyed across page navigation in Webkit, so it can be used to write some 'background' or 'daemon' like code.

So you can write and start your http server locally on 127.0.0.1 and communicate with it.


If your concern is to load resources only, you can add them directly by providing absolute or relative paths.

For Example:

<link rel="stylesheet" type="text/css" href="/bower_components/angular-ui-grid/ui-grid.css"/>
<script src="/bower_components/jquery/dist/jquery.min.js"></script>

Use the app protocol

Further more, there is an app:// protocol provided in nw.js which you can use to access files locally. See the documentation.

Note:

The root of path refers to the application's directory, which is the directory where the manifest file resides.

m5khan
  • 2,667
  • 1
  • 27
  • 37
  • First, thank you for helping! Second, my app simply won't work with app protocol, I tried and it's not working. Third, I want to use a web server but every time I execute a command(any command) in node-main, nw.js opens and exits. What is causing this? Thank you for your help! :) – McLinux Jan 15 '16 at 23:02
  • Have you tried app path in your manifest ? `"main": "app://whatever/index.html",`. You can confirm that node-main script should be independent and must not be referenced in any of your HTML. nw.js open and exits if the statement is invalid or not supported in node i.e alert. Even if you are trying to access window from node-main, nwjs will exit. – m5khan Jan 16 '16 at 07:57
  • I have tried app path, but my app simply won't work without a web server and I don't know why? Also, I put my code in my question above, could you please look at my node-main code and tell me why it's opening and closing? Thanks! – McLinux Jan 18 '16 at 14:51
  • And I have one more question. You can see that I have set my code to use port 8888, what if that port is already used? What should I do in that case? – McLinux Jan 18 '16 at 15:31
  • I ran your node-main code and it threw an error `Error: listen EADDRINUSE :::8888`. This showed that address is already in use. Then I wrote the same code without `setTimeout` and it worked fine. I think `setTimeout` is causing server to get hold of address twice. Still in both cases server is running perfectly. I send request to `127.0.0.1:8888` and my request got handeled with status code 200. What version of nwjs are you using and in which OS – m5khan Jan 19 '16 at 07:37
  • If you are running another server that is already bound to the port `8888`, your server will fail to start and will throw this error: `Error: listen EADDRINUSE :::8888`. In that case open the connection to another port. other than 8888 – m5khan Jan 19 '16 at 07:39