NowJs server different to web server
-
20-06-2021 - |
Frage
I'm playing around with nodejs and specifically looking at nowjs
I've got now up and running on a server running node and I have a separate web server. I successfully have the node server returning the client script and I reference this on the web server. This returns a 200 response code and all looks well. However I get javascript errors telling me that 'now' is undefined. As far as I understand it the 'now' variable should be available via the client script but this doesn't seem to be the case. Does anyone know if this set-up is possible? So the set-up is similar to the below pseudo code
//Server 1 node.com
if(request.url === '/nowjs/now.js'){
var file = 'path_to_clientlib/now.js';
fs.readFile(file, function(e, data) {
if (e) {
throw e;
}
response.writeHead(200,{'Content-Type': 'application/javascript'});
response.end(data);
}
and server.com
<script src="/jquery.js"></script>
<script src="http://node.com/nowjs/now.js"></script> <!-- This is returned properly -->
<script>
$(document).ready(function(){
now.receiveMessage = function(name, message){
$("#messages").append("<br>" + name + ": " + message);
}
$("#send-button").click(function(){
now.distributeMessage($("#text-input").val());
$("#text-input").val("");
});
now.name = prompt("What's your name?", "");
});
</script>
<div id="messages"></div>
<input type="text" id="text-input">
<input type="button" value="Send" id="send-button">
Straight away the console just returns 'now' is not defined
Lösung
First of all there are enough modules that provide static file serving support, but if you want to manually serve a file I would do it like this...
var mime = require('mime') // Get mime type based on file extension. use "npm install mime"
, util = require('util')
, fs = require('fs');
function serveFile(filename, res) {
var filePath = process.cwd() + filename;
var stat = fs.statSync(filePath);
res.writeHead(200, {
'Content-Type':mime.lookup(filePath),
'Content-Length':stat.size
});
var readStream = fs.createReadStream(filePath);
return util.pump(readStream, res);
}
// Your code...
Or check out the module node-static on NPM or Github
About how to use NowJS (from the docs)
On the server
var httpServer = require('http').createServer(function(req, response){
// See code above how to serve static files...
});
httpServer.listen(8080);
var nowjs = require("now");
var everyone = nowjs.initialize(httpServer);
everyone.now.logStuff = function(msg){
console.log(msg);
}
On the client
<script type="text/javascript" src="http://localhost:8080/nowjs/now.js"></script>
<script type="text/javascript">
now.ready(function(){
// "Hello World!" will print on server
now.logStuff("Hello World!");
});
</script>