Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.11.2012, 15:07
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

Кто с нодой может помочь? И какой редактор посоветуете?
var KB = 1024;
var MB = 1048576;
var GB = 1073741824;
var SECOND = 1000;
var MINUTE = 60000;
var HOUR = 3600000;
var DAY = 86400000;
var WEEK = 604800000;
var MONTH = 2628000000;
var YEAR = 31536000000;
// добавляем свои
var ALLOWED_METHODS = ['GET', 'POST'];
var LISTEN_PORT = 8080;
var STATIC_FILES_DIRECTORY = './public';
var MAX_REQUEST_LENGTH = 4 * MB;
var http = require('http');
var fs = require('fs');
var qs = require('querystring');
var url = require('url');
var path = require('path');
var util = require('util');

var routes = {
    GET: [
        ['/', function(rq, rs) {
            rs.writeHead(202, {'content-type': 'text/html'});
            rs.end('<form action="/login" method="post">' +
                   '<input name="username" placeholder="Введите имя">\n' +
                   '<input name="password" type="password" placeholder="Введите пароль">\n' +
                   '<input type="submit"></form>');
        }],

        ['/index.htm', function(rq, rs) {
            rs.writeHead(302, {location: '/', connection: 'close'})
            rs.end();
        }],
    ],

    POST: [
        ['/login', function(rq, rs) {
            rs.end(JSON.stringify(rq.body));
        }],
    ]
};

// var fs = require('fs');
// var path = require('path');
//
// module.exports = new function() {
var mime = new function() {
    // используется от Apache
    var MIME_TYPES_FILENAME = './mime.types';
    var DEFAULT_MIME_TYPE = '*'; // application/octet-stream
    var types = {};
    var extensions = {};
    var content = fs.readFileSync(MIME_TYPES_FILENAME, 'ascii');
    var pos = 0;
    var start = 0;

    while ((pos = content.indexOf('\n', start)) > -1) {
        var line = content.substr(start, pos - start);
        // удаляем комментарии и пробелы на концах строки
        line = line.replace(/#.*/, '');
        line = line.trim();

        if (line) {
            var fields = line.split(/\t+|\s+/);
            var type = fields.shift();
            extensions[type] = fields[0];
            var extension;
            var i = 0;

            while (extension = fields[i++]) {
                types[extension] = type;
            }
        }

        start = pos + 1;
    }

    // mime.getTypeByExtension('.ext');
    this.getTypeByExtension = function(extension) {
        extension = extension.split('.')[1];
        return extension && types[extension] ? types[extension] : DEFAULT_MIME_TYPE;
    }

    // mime.getTypeByFilename('path/to/file.ext');
    this.getTypeByFilename = function(filename) {
        return this.getTypeByExtension(path.extname(filename));
    }

    // mime.getExtensionByType('type/subtype');
    this.getExtensionByType = function(type) {
        return extensions[type] ? '.' + extensions[type] : '';
    }
}; // ошибка без ';'
// var mime = require('./mime');

(function() {
    // ServerRequest является объектом IncomingMessage
    var rq = http.IncomingMessage.prototype;
    var rs = http.ServerResponse.prototype;

    rs.setCookie = function(name, value, expires, path, domain, secure, httponly) {
        var cookies = this.getHeader('set-cookie');

        if (cookies === undefined) {
            cookies = [];
        }
        else if (typeof cookies == 'string') {
            cookies = [].concat(cookies);
        }

        cookies.push(name + '=' + qs.escape(value) +
        (expires === undefined ? '' : '; Expires=' + new Date(expires).toUTCString()) +
        (path ? '; Path=' + path : '') + (domain ? '; Domain=' + domain : '') +
        (secure ? '; Secure' : '') + (httponly ? '; HttpOnly' : ''));
        this.setHeader('set-cookie', cookies);
    }

    rs.removeCookie = function(name, path, domain) {
        this.setCookie(name, '', 0, path, domain);
    }
})();

var server = http.createServer(function(rq, rs) {
    // метод не поддерживается, отсылаем заголовки ничего не выводим
    if (ALLOWED_METHODS.indexOf(rq.method) == -1) {
        rq.pause();
        rs.writeHead(405, {connection: 'close'});
        return rs.end();
    }

    var urlObj = url.parse(rq.url);
    rq.path = qs.unescape(urlObj.pathname);
    rq.query = urlObj.query;
    rq.hash = urlObj.hash;
    rq.cookies = qs.parse(rq.headers['cookie'], '; ');
    rq.isXhr = rq.headers['x-requested-with'] == 'XMLHttpRequest';
    rq.body = [];

    // ищем обработчик пути
    var runRoute;

    if (routes[rq.method]) {
        var subroutes = routes[rq.method];
        var route;
        var i = 0;

        while (route = subroutes[i++]) {
            if (route[0] instanceof RegExp) {
                var matches = rq.path.match(route[0]);

                if (matches) {
                    runRoute = function() {
                        route[1].apply(null, [rq, rs].concat(matches.slice(1)))
                    }

                    break;
                }
            }
            else if (route[0] === rq.path) {
                runRoute = function() {
                    route[1](rq, rs);
                }

                break;
            }
        }
    }

    // если его нет отдаем статику
    if (!runRoute) {
        rq.pause();
        console.log('serve static files');
        var filename = STATIC_FILES_DIRECTORY + rq.path;

        fs.exists(filename, function(exists) {
            if (!exists) {
                rs.writeHead(404, {connection: 'close'});
                rs.end('404 Not Found\n');
                return;
            }

            fs.readFile(filename, function(err, content) {
                if (err) {
                    // файл является директорией или ?
                    rs.writeHead(500, {connection: 'close'});
                    rs.end('500 Internal Server Error\n');
                    return;
                }

                rs.writeHead(200, {'content-type': mime.getTypeByFilename(filename)});
                rs.end(content);
            });
        });

        // вышли
        return;
    }

    var requestLength = rq.headers['content-length'] > MAX_REQUEST_LENGTH ? MAX_REQUEST_LENGTH : 0;

    rq.on('data', function(chunk) {
        requestLength += chunk.length;

        if (requestLength > MAX_REQUEST_LENGTH) {
            // ждем когда сборщик мусора убьёт поток
            rq.pause();
            rs.writeHead(413, {connection: 'close'});
            rs.end();
            console.log('maximum request length exceeded');
            return;
        }

        this.body.push(chunk);
    });

    // ждем пока клиент не закончит передачу данных
    rq.on('end', function() {
        console.log('bytes recieved ' + requestLength);
        this.body = Buffer.concat(this.body);

        if (this.method == 'POST' && this.headers['content-type'] == 'application/x-www-form-urlencoded') {
            this.body = qs.parse(this.body.toString());
        }

        // вызываем обработчик
        runRoute();
    });
});

server.listen(LISTEN_PORT);
console.log('server was started');


Вот тут все ли правильно я делаю?
Ответить с цитированием
  #2 (permalink)  
Старый 22.11.2012, 15:08
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

Все работает. Но мне интересно правильно ли сама логика приложения организована, замечания к стилю тоже приветствуются
Ответить с цитированием
  #3 (permalink)  
Старый 22.11.2012, 15:50
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Антон Крамолов
Но мне интересно правильно ли сама логика приложения организована, замечания к стилю тоже приветствуются
нет конечно, разве удобно с такой простынёй работать?
Ответить с цитированием
  #4 (permalink)  
Старый 22.11.2012, 16:07
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

определённо, неудобно.
да и изобретать велосипеды, типа отдачи статики, тоже ни к чему.

на том же хабре почитайте статьи по ноде, есть красивые примеры.
Ответить с цитированием
  #5 (permalink)  
Старый 22.11.2012, 16:19
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

Сообщение от dmitriymar Посмотреть сообщение
нет конечно, разве удобно с такой простынёй работать?
в чем ошибка?

замечания комментатора выше пропускаю, элементарные вещи, которые делаются в 10 строк должен уметь каждый
Ответить с цитированием
  #6 (permalink)  
Старый 22.11.2012, 16:22
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

Вопрос такой в мануале чтобы остановить читающий поток(ServerRequest) своетуют вызывать rq.pause() http://www.nodejs.org/api/all.html#all_request_pause Pauses request from emitting events. Useful to throttle back an upload. так вот можно еще использовать rq.connection.destroy(); что предпочтительнее?
Ответить с цитированием
  #7 (permalink)  
Старый 22.11.2012, 16:25
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

не, ну если не ищете лёгких путей, то конечно.
уметь изобретать велосипеды и использовать собственноручно изобретённые - вещи разные
но я предпочитаю писать
app.use(express.static(STATIC_PATH));

вместо
var filename = STATIC_FILES_DIRECTORY + rq.path;
177	 
178	        fs.exists(filename, function(exists) {
179	            if (!exists) {
180	                rs.writeHead(404, {connection: 'close'});
181	                rs.end('404 Not Found\n');
182	                return;
183	            }
184	 
185	            fs.readFile(filename, function(err, content) {
186	                if (err) {
187	                    // файл является директорией или ?
188	                    rs.writeHead(500, {connection: 'close'});
189	                    rs.end('500 Internal Server Error\n');
190	                    return;
191	                }
192	 
193	                rs.writeHead(200, {'content-type': mime.getTypeByFilename(filename)});
194	                rs.end(content);
195	            });
Ответить с цитированием
  #8 (permalink)  
Старый 22.11.2012, 16:26
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

Сообщение от Антон Крамолов Посмотреть сообщение
Вопрос такой в мануале чтобы остановить читающий поток(ServerRequest) своетуют вызывать rq.pause() http://www.nodejs.org/api/all.html#all_request_pause Pauses request from emitting events. Useful to throttle back an upload. так вот можно еще использовать rq.connection.destroy(); что предпочтительнее?
может стоит плясать от задачи, которая стоит?
зачем именно вам приостанавливать реквест?)
Ответить с цитированием
  #9 (permalink)  
Старый 22.11.2012, 16:30
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

а зачем тратить процессорное время на прием какого-нить многогигабайтного файла? этож сервак так когда нить упадет
Ответить с цитированием
  #10 (permalink)  
Старый 22.11.2012, 16:31
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

express это херня. я его не смогу переписать под свои нужды, расширить функционал и т.д., т.е. становлюсь в зависимость от сторонних разработчиков
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выделить активный пункт меню в моём случаи? может кто помочь? nStyle jQuery 10 11.03.2012 01:51
ротатор котента, может кто встречал? adik jQuery 0 13.01.2012 08:34
Кто может написать JavaScript? ANTIKILLERYURA Работа 5 30.05.2011 02:30
Может кто объяснить =)? mexoboy Общие вопросы Javascript 11 19.04.2011 14:37