When you are a beginner, you have discovered a scene that is completely different from your previous viewpoint - what is JavaScript used for in your eyes? Special effects? or Is it just an interaction with the client? It can be said that JavaScript was first run in the browser. However, if you think about it this way, the browser just provides a context that defines what you can do with JavaScript. Here you can think of it as a similar enterprise. The enterprise defines what you can do here, but it does not say much about what the JavaScript language itself can do. In fact, as a complete language, JavaScript can be used in different contexts and reflects different abilities. The Nodejs mentioned here is actually to put it bluntly, which provides a context and a running environment, which allows JavaScript code to be run on the backend (out of the browser environment).
The core of routing is routing. As the name suggests, routing refers to the different processing methods we need to handle different URLs, such as processing/start's business logic and processing/upload module's business logic; logic is inconsistent. In reality, the routing process will "end" in the routing module, and the routing module is not a real module that "takes action" against the request, otherwise our application will not be able to be well expanded when it becomes more complex.
Here we first create a module called requestHandlers, and add a placeholder function for each request handler:
The code copy is as follows:
function start(){
console.log("Request handler 'start' was called.");
function sleep(milliSeconds){
var startTime=new Date().getTime();
while(new Date().getTime()<startTime+milliSeconds);
}
sleep(10000);
return "Hello Start";
}
function upload(){
console.log("Request handler 'upload' was called.");
return "Hello Upload";
}
exports.start=start;
exports.upload=upload;
In this way, we can connect the request handler and the routing module to make the route "has a way to follow". After that, we determined to pass a series of request handlers through an object, and we need to use loosely coupled methods to inject this object into the router() function, the main file index.js:
The code copy is as follows:
var server=require("./server");
var router=require("./router");
var requestHandlers=require("./requestHandlers");
var handle={};
handle["/"]=requestHandlers.start;
handle["/start"]=requestHandlers.start;
handle["/upload"]=requestHandlers.upload;
server.start(router.route,handle);
As shown above, it is easy to map different URLs to the same request handler: just add a property with the key "/" to the object, corresponding to requestHandlers.start. In this way, we can simply configure /start and / to handle both requests to start. After finishing looking at the definition of the object, we pass it as an extra parameter to the server, see server.js:
The code copy is as follows:
var http=require("http");
var url=require("url");
function start(route,handle){
function onRequest(request,response){
var pathname=url.parse(request.url).pathname;
console.log("Request for "+pathname+" received.");
route(handle,pathname);
response.writeHead(200,{"Content-Type":"text/plain"});
var content=route(handle,pathname);
response.write(content);
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start=start;
In this way, the handle parameter is added to the start() function, and the handle object is passed as the first parameter to the route() callback function. The following defines route.js:
The code copy is as follows:
function route(handle,pathname){
console.log("About to route a request for "+ pathname);
if(typeof handle[pathname]==='function'){
return handle[pathname]();
}else{
console.log("No request handler found for "+pathname);
return "404 Not Found";
}
}
exports.route=route;
Through the above code, we first check whether the request handler corresponding to the given path exists, and if so, we will directly call the corresponding function. We can get the request handling function from the passed object in the same way as getting elements from the associative array, that is, handle[pathname](); such an expression gives people the feeling that it is saying "Hi, please help me with this path." The program running effect is as follows: