NodeJS导出阻止代码

时间:2015-05-18 15:59:01

标签: javascript node.js callback server nonblocking

我正在尝试创建一个并行运行的服务器。我有两个主要问题:

  1. 某些方面阻止并将停止处理另一个请求
  2. 请求混淆,错误的响应发送给错误的客户端。
  3. 这是我的代码:

    服务器文件:

    var http = require('http');
    var controller = require('controller.js');
    http.createServer(function (request, response) {
        controller.handle(request, response);
    }).listen(8080, '0.0.0.0');
    

    控制器文件

    var resp = require('./resp.js');
    var sqltest = require('/sql/sqltest.js');
    
    exports.handle = function(request, response) {
        request.on('data', function(chunk) {
            var json = JSON.parse(chunk);
            var type = parseInt(json["requestType"]);
    
            switch(type) {
                case 0:
                    sqltest.try(json, function(res){
                    resp.send(response, res);
                    });
                break;
           }
         });
    }
    

    SQL测试文件

    var mysql = require('mysql');
        exports.try = function(json, callback, res) {
        -- doo database stuff --
        callback(res);
        });
    }
    

    响应文件

    exports.send = function(response, res){
        response.writeHead(200, ......);
        response.end(res);
    }
    

    基本上,这台服务器非常庞大,我不能将数万行代码全部放在一个文件中。通过分解它,我会以任何方式损害性能,这会导致任何阻塞代码,服务器是否会跟踪正确的客户端响应?

    我对节点和javascript一般都很新,所以也许我很想念 - 基本概念是如何工作的。任何建议或改进都将是一个很大的帮助!

1 个答案:

答案 0 :(得分:0)

对于关注的问题#1,您发布的代码都没有阻止,但您对这一点感到担忧。节点是单线程的,编写阻塞或需要很长时间才能计算的代码在节点中是一个坏主意。好消息是节点非常面向异步。虽然可以在节点中编写阻塞代码,这是常见库的设计方式,但你必须不遗余力地编写阻塞函数。

这个SO答案有很多很好的细节可以帮助你理解它:https://stackoverflow.com/a/14797359/77501

关注#2,我不确定你的意思。您是否害怕调用SQL异步回调,res var以某种方式指向别人的请求?

关于底部的模糊,在一个文件中拥有所有代码对性能没有明显的影响。如果你的应用程序可能启动的速度要快一些,因为它可以加载较少的模块。

由于其他原因,将大量代码塞进单个文件中是个坏主意。将代码拆分为模块将使您的代码更具可重用性,允许您编写更少的代码。更少的代码更好。通过将数千行代码拆分为可以完成所有工作的模块,为数千行代码提供清晰的架构。 (也称为凝聚力)也将使您的代码更容易理解,更容易构建,更容易调试。