Is it possible to create a page (route) on the fly with node.js ?
Say I have a simple text input in a form on create-route.html file ( localhost:4001/create-route ), and I was to enter "my-page", This would then take me to a new view with the url of localhost:4001/my-page displaying a success message.
I'm not really sure if this is possible, because I'm also unsure what node modules would allow the client to access the createServer object, to manipulate it. Looking around 'Express' is referenced a lot for routing , but I'm keen to see if this is possible in Node alone, before looking at a framework.
Any help is appreciated, thanks.
webserver.js
var http = require('http')
, url = require('url')
, fs = require('fs')
, server;
// declare http object
server = http.createServer(function(req,res){
// parse the pathname as a url, get the trimmed route from the request
var path = url.parse(req.url).pathname;
// handle the various routes
switch(path){
case '/':
fs.readFile(__dirname + '/index.html', function (err, data) {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data, 'utf8');
res.end();
});
case '/create-route':
fs.readFile(__dirname + '/create-route.html', function (err, data) {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data, 'utf8');
res.end();
});
// example of dynamically created 'route'
// "value' indicates the name that was inputted into the for on create-route.html, which in this case should be "my-page"
case '/value':
if (err) {throw err;}
var body = "<html>" +
"<head>" +
"<meta http-equiv='Content-Type' content='text/html'" +
"charset=UTF-8 />" +
"</head>" +
"<body>" +
"<p>youve just created a page called " + value + "</p>" +
"</body>" +
"</html>";
res.writeHead(200, {"Content-Type": "text/html"});
res.write(body);
res.end();
});
break;
default: send404(res);
}
});
create-route.html
<html>
<head>
<title>Create a route</title>
</head>
<body>
<form action="/go-to-the-created-route">
<label>Enter a route name:</label>
<input type="text" name="create-route" id="create-route">
<button type="submit">Submit</button>
</form>
</body>
</html>
Updated Routes as per feedback
Here is the updated 'go-to-created-route' route as per @penartur feedback.
// Define the go-to-created-route
routes["go-to-created-route"] = function (req, res) {
// get the request url and split it to get the inputted value
var reqPath = req.url;
var splitPath = reqPath.split("=");
var routeName = splitPath[(splitPath.length - 1)]; // outputs the value entered into text input
//console.log(routeName);
// create the new route by passing in the value of routeName, and display a page
routes[routeName] = function (req, res) {
// Not getting in here :(
console.log("hello?");
var body = "<html>" +
"<head>" +
"<meta http-equiv='Content-Type' content='text/html'" +
"charset=UTF-8 />" +
"</head>" +
"<body>" +
"<p>youve just created a page called " + routeName + "</p>" +
"</body>" +
"</html>";
res.writeHead(200, {"Content-Type": "text/html"});
res.write(body);
res.end();
};
};
It is a simple programming problem, not having much to do with the specific Node.js. The draft of the solution:
var http = require('http')
, url = require('url')
, fs = require('fs')
, server;
var routes = {};
routes["create-route"] = function (req, res) {
fs.readFile(__dirname + '/create-route.html', function (err, data) {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data, 'utf8');
res.end();
});
};
routes["go-to-the-created-route"] = function (req, res) {
var routeName = req.body["create-route"];
routes[routeName] = function (req, res) {
var body = "<html>" +
"<head>" +
"<meta http-equiv='Content-Type' content='text/html'" +
"charset=UTF-8 />" +
"</head>" +
"<body>" +
"<p>youve just created a page called " + routeName + "</p>" +
"</body>" +
"</html>";
res.writeHead(200, {"Content-Type": "text/html"});
res.write(body);
res.end();
};
};
// declare http object
server = http.createServer(function(req,res){
// parse the pathname as a url, get the trimmed route from the request
var path = url.parse(req.url).pathname;
var firstPart = path.split('/')[1];
if (routes.hasOwnProperty(firstPart)) {
routes[firstPart](req, res);
} else {
send404(res);
}
});