一个完整的基于Node.js的web应用(入门级)

在此之前先大概了解下Node.js(服务端的javascript):

Node.js事实上是另外一种上下文,它允许在后端(脱离浏览器环境)运行JavaScript代码。

要实现在后台运行JavaScript代码,代码需要先被解释然后正确的执行。Node.js的原理正是如此,它使用了Google的V8虚拟机 (Google的Chrome浏览器使用的JavaScript执行环境),来解释和执行JavaScript代码。

除此之外,伴随着Node.js的还有许多有用的模块,它们可以简化很多重复的劳作,比如向终端输出字符串。

因此,Node.js事实上既是一个运行时环境,同时又是一个库。

要使用Node.js,首先需要进行安装。关于如何安装Node.js,可以直接进入官方网址https://nodejs.org/en/

我们的Web应用要求可以分文一下三点:

  • 用户可以通过浏览器使用我们的应用。
  • 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单。
  • 用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/upload,该页面完成上传后会把图片显示在页面上。

接下来就开始动手,先用记事本创建一个server.js文件,用于构建一个简单的http服务器,代码如下:

//创建一个http模块
var http = require("http");
//创建一个url模块
var url = require("url");
function start(route,handle){
      function onRequest(request, response){
            var postData = "";
            var pathname = url.parse(request.url).pathname;
            console.log(typeof handle[pathname]);
            console.log("Request for "+pathname+" received.");
            route(handle, pathname, response, request);
      }
      http.createServer(onRequest).listen(8888);
      console.log("Server has started");
}
//导出server模块
exports.start = start;

创建一个请求“路由”文件router.js,方便把服务端的对象参数传递给事件处理程序,就是待会要创建的新文件,代码如下:

function route(handle, pathname, response, request){
  console.log("About to route a request for "+ pathname);
  if(typeof handle[pathname]==='function'){
    return handle[pathname](response, request);
  }else{
    console.log("No request handler found for "+ pathname);
    response.writeHead(404,{"Content-Type":"text/plain"});
    response.write("404 Not found");
  }
}

exports.route = route;

接下来创建requestHanders.js文件,对事件进行处理,代码如下:

var querystring = require("querystring"),
      fs = require("fs"),
      formidable = require("formidable");

function start(response){
    console.log("Request handler 'start' was called.");

    var body = '<html>' +
         '<head>' +
         '<meta http-equiv="Content-Type" content="text/html; ' +
         'charset=UTF-8" />' +
         '</head>'+
         '<body>' +
         '<form action="/upload" enctype="multipart/form-data" '+' method="post">' +
         '<input type="file" name="upload" multiple="multiple" style="margin:100px auto 0;border:1px solid #ccc;border-radius:4px;display:block;" />'+
         '<input type="submit" value="Upload file"  style="width:200px;height:30px;border-radius:4px;border:1px solid #ccc;margin:40px auto;background-color:#109059;display:block;"/>' +
         '</form>' +
         '</body>' +
         '</html>';
         
         response.writeHead(200,{"Content-Type":"text/html"});
         response.write(body);
         response.end();
}
function upload(response, request){
    console.log("Request handler 'upload' was called.");

    var form = new formidable.IncomingForm();
    form.uploadDir = 'tmp';
    console.log("about to parse");
    form.parse(request,function(error, fields, files){
         if(error){throw error;}
         console.log("parsing done");
         fs.renameSync(files.upload.path, "/tmp/test.png");
         response.writeHead(200,{"Content-Type":"text/html"});
         response.write("received image:<br/>");
         response.write("<img src='/show' />");
         response.end();
    });
}
function show(response, postData){
    console.log("Request handler 'show' was called.");
    fs.readFile("./tmp/test.png", "binary", function(error, file){
        if(error){
             response.writeHead(500,{"Content-Type":"text/plain"});
             response.write(error + "\n");
             response.end();
        }else{
             response.writeHead(200,{"Content-Type":"image/png"});
             response.write(file,"binary");
             response.end();
        }
    });
}

exports.start = start;
exports.upload = upload;
exports.show = show;

最后一步需要创建一个主文件index.js,把三个分散的模块连接在一起:

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;
handle["/show"] = requestHandlers.show;

server.start(router.route,handle);

然后在命令行启动服务器输入命令node index.js(记住必须切换到文件目录下运行文件)

浏览器呈现的效果图:

点击浏览选择./tmp/test.png图片进行测试,图片的路径一定要是与四个js文件在同一个目录下,然后点击上传后,如下图所示:

一个基础的web应用到此就完成了,具体参考node初学者入门,网址:http://ourjs.com/detail/529ca5950cb6498814000005

 

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一个 AI 语言模型,我认为 node.js 是一项非常有用的技术,它可以让开发者使用 JavaScript 在服务器端编写高效的网络应用程序。它具有轻量级、高效、跨平台等优点,可以帮助开发者快速构建可扩展的网络应用程序。 ### 回答2: Node.js是一项非常有前景的技术。它是一个基于Chrome V8 JavaScript引擎构建的运行时环境,能够让JavaScript在服务器端运行。相比于传统的服务器技术,它具有许多独特的优势。 首先,Node.js具有出色的性能和高并发能力。由于Node.js采用了事件驱动、非阻塞I/O的方式,使得它能够应对大量的并发请求,处理高实时性的应用。这使得Node.js非常适合开发实时应用、大规模网络服务器以及消息推送等场景。 其次,Node.js具有简单、轻量级的开发模式。Node.js使用JavaScript语言开发,对于前端开发人员来说具有很低的学习曲线。并且,Node.js具有渐进式开发的特点,可以逐步构建复杂的应用,方便快捷。 同时,Node.js拥有强大的扩展能力。它拥有丰富的第三方模块和工具库,可以满足各种不同需求。而且,Node.js还支持NPM包管理器,能够快速安装、升级和发布代码。 值得一提的是,Node.js在开发社区非常活跃。社区有大量的教程、档和示例代码,这些资源能够让开发者快速入门,并解决问题。 然而,Node.js也存在一些挑战。首先,由于基于单线程的特性,如果代码出现阻塞操作,会导致整个应用的性能下降。其次,由于JavaScript的动态特性,代码容易出现难以察觉的错误。 总的来说,我认为Node.js是一项非常有前景的技术。它灵活、高效,适用于构建实时性需求高的应用,尤其在Web开发领域有着广泛的应用前景。但是在使用时需要注意一些潜在的问题,避免影响应用的性能和稳定性。 ### 回答3: 我对Node.js这项技术持有正面评价。Node.js是一种基于JavaScript运行时环境的开发框架,它的特点是轻量、高效、事件驱动和非阻塞式的I/O操作。Node.js的出现为前后端统一开发提供了可能,使得开发人员可以使用相同的语言进行全栈开发。 首先,Node.js具有出色的性能和高并发处理能力。由于其事件驱动的特点以及底层使用JavaScript V8引擎,使得Node.js可以处理大量并发请求,适用于需要高性能和实时响应的应用场景,如实时聊天、电子商务等。 其次,Node.js拥有庞大的生态系统和丰富的第三方库支持。NPM(Node Package Manager)是Node.js的包管理器,目前已经有数量庞大的开源库可供开发者使用,极大地提高了开发效率。这也意味着开发者可以借助这些现有的模块和框架进行快速开发,极大地降低了开发成本。 另外,Node.js具有良好的跨平台特性,可以在多个操作系统使用,比如Windows、Mac OS和Linux等。这使得开发者可以更加灵活地选择开发环境,减少了学习成本和开发的局限性。 然而,Node.js也存在一些挑战和限制。由于是单线程的,如果在处理大量计算密集型的任务时,可能会导致阻塞其他请求。此外,对于大型规模的应用或者需要消耗大量内存的任务,相对来说并不是最佳选择。 总体来说,我认为Node.js是一项非常有潜力和发展前景的技术。它通过高性能、高效率的特点,使得开发人员可以更加方便地构建可扩展、实时和高并发的Web应用程序。当然,针对具体的应用场景和需求,我们仍需要综合考虑使用Node.js的优点和不足来做出选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值