nodejs & ошибка грозного заголовка - PullRequest
10 голосов
/ 05 февраля 2012

Вслед за: Книга для начинающих узлов

Я не могу отладить эту проблему или найти решение в Интернете.Новичок в Node.js, надеясь, что кто-то может предложить решение

ОШИБКА: Обновлено с данными журнала консоли Суббота, 11 февраля 2012 г. 7:27:17

Request for/ received!
About to route a request for /
Request handler 'start' was called.
Request for/favicon.ico received!
About to route a request for /favicon.ico
No request handler found for /favicon.ico
Request for/favicon.ico received!
About to route a request for /favicon.ico
No request handler found for /favicon.ico
Request for/upload received!
About to route a request for /upload
Request handler 'upload' was called.
about to parse
{ output: [],
  outputEncodings: [],
  writable: true,
  _last: false,
  chunkedEncoding: false,
  shouldKeepAlive: true,
  useChunkedEncodingByDefault: true,
  _hasBody: true,
  _trailer: '',
  finished: false,
  socket: 
   { _handle: 
      { writeQueueSize: 0,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 0,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 66509,
     bytesWritten: 638,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Sat, 11 Feb 2012 15:25:28 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: [Circular] },
  connection: 
   { _handle: 
      { writeQueueSize: 0,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 0,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 66509,
     bytesWritten: 638,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Sat, 11 Feb 2012 15:25:28 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: [Circular] },
  _events: { finish: [Function] } }

/usr/local/lib/node_modules/formidable/lib/incoming_form.js:247

undefined
  if (this.headers['content-length']) {
                  ^

TypeError: Cannot read property 'content-length' of undefined
    at IncomingForm._parseContentLength (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:247:19)
    at IncomingForm.writeHeaders (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:126:8)
    at IncomingForm.parse (/usr/local/lib/node_modules/formidable/lib/incoming_form.js:80:8)
    at Object.upload [as /upload] (/Applications/MAMP/htdocs3/js/nodejs/webapp/requestHandlers.js:34:8)
    at route (/Applications/MAMP/htdocs3/js/nodejs/webapp/router.js:4:20)
    at Server.onRequest (/Applications/MAMP/htdocs3/js/nodejs/webapp/server.js:20:3)
    at Server.emit (events.js:70:17)
    at HTTPParser.onIncoming (http.js:1511:12)
    at HTTPParser.onHeadersComplete (http.js:102:31)
    at Socket.ondata (http.js:1407:22)

Ошибка завершения

requestHandlers.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">'+
    '<input type="submit" value="Upload file" />'+
    '</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();
  console.log("about to parse");
  form.parse(request, function(error, fields, files) {
    console.log("parsing done");

    /*
     * Some systems [Windows] raise an error when you attempt to rename new file into one that already exists.
     * This call deletes the previous .PNG image prior to renaming the new one in its place.
    */
    fs.unlinkSync(__dirname +"/tmp/test.jpg");
    fs.renameSync(files.upload.path, "/tmp/test.jpg");
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("received image:<br/>");
    response.write("<img src='/show' />");
    response.end();
  });
}

function show(response) {
  console.log("Request handler 'show' was called.");
  fs.readFile(__dirname + "/tmp/test.jpg", "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/jpg"});
      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);

router.js

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

exports.route = route;

server.js

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, request);
  }

  // http.createServer(onRequest).listen(8888);
  //  console.log("Server has started.");
    http.createServer(onRequest).listen(1337, "127.0.0.1");
    console.log('Server Has Started!');
}

exports.start = start;

Ответы [ 4 ]

2 голосов
/ 08 октября 2013

Нет необходимости использовать старые версии Node и Formidable.Я смог заставить пример работать с Node v0.10.20 и Formidable v1.0.14.Может показаться, что свойство files.upload больше не используется.

Просто измените следующую строку из книги:

    fs.rename(files.upload.path, "/tmp/test.png", function(error) { ... });

на

    fs.rename(files.file.path, "/tmp/test.png", function(error) { ... });

...и тогда загрузка работает отлично!


Еще один необязательный твик к примеру (особенно для разработчиков Windows)

Вместо использования состояния ошибки из fs.rename() чтобы определить, существует ли файл, мне очень повезло, используя fs.exists(), чтобы проверить существующий файл, который выглядел как малый взлом.Я также сохранил файл test.png в локальном каталоге, поскольку /tmp - довольно неестественный путь Windows ...

var img = "./test.png";

...

    fs.exists(img, function(exists){
        if(exists){ fs.unlink(img); }

        fs.rename(files.file.path, img);

        ...
0 голосов
/ 28 апреля 2014

Ну, у меня такой же код, как и у вас, но с небольшим изменением в функции загрузки на RequestHandlers.js, попробуйте изменить это:

function upload(response, request) { 
...
var form = new formidable.IncomingForm();
...
}

к этому:

function upload(response, request){
...
var form = new formidable.IncomingForm(), files = [], fields = [];
...
}

Если это не сработает, вы сможете увидеть, как формируется заголовок запроса:

function upload(response, request){
...
form.parse(request, function(error, fields,files){
console.dir(request.headers);
...
}
}

Надеюсь, вы решите свою проблему

0 голосов
/ 24 января 2013

Если вы используете те же версии Formidable и Node.js, что и в учебном пособии, код работает так, как объявлено.

Версия Formidable, используемая в учебном пособии, 1.0.2 .Чтобы получить эту версию, введите:

$ sudo npm install formidable@1.0.2

Версия Node.js: 0.6.10 , которую можно найти здесь: https://github.com/joyent/node/tags

0 голосов
/ 12 февраля 2012

Для чего стоит вышеприведенный код работал для меня.

Проблема, кажется, возникает внутри грозного.Проверка package.json в node_modules Я использую версию 1.0.8 на node -v = v0.4.12.

Похоже, что ваш браузер или запрос не включают в запрос заголовок длины содержимого.Я использовал Chrome, но если вы используете CURL или, возможно, делаете запрос асинхронно или в виде потока, у вас может не быть заголовка длины содержимого в запросе, вызывающем эту проблему.Это несколько обсуждается здесь: https://github.com/felixge/node-formidable/issues/93

На мой взгляд, грозный должен правильно проверить наличие параметра (typeof(this.headers['content-length']) != undefined).Другим было бы полезно, если бы вы определили свой браузер и тип файла, который вы пытались загрузить, тогда вы можете отправить сообщение об ошибке на https://github.com/felixge/node-formidable/

Примечание: вы также можете обновить заголовок этого вопроса до nodejs не nodjs.Удачи с узлом!

...