2016-08-17 3 views
0

У меня есть сценарий на стороне сервера Node.js, который успешно загружает «что-то» в указанный каталог. Но это не мой выбранный файл и ошибка сценария из заявляющей:Node.JS загрузка файлов не сохранение файлов текущее состояние при загрузке

Request received: POST 
undefined:1 
------WebKitFormBoundary1urLweAWe6T1VpEA 
^ 

SyntaxError: Unexpected number 
at Object.parse (native) 
at IncomingMessage.<anonymous> (C:\Users\gcampbell\De 
p.js:51:33) 
at emitOne (events.js:82:20) 
at IncomingMessage.emit (events.js:169:7) 
at readableAddChunk (_stream_readable.js:153:18) 
at IncomingMessage.Readable.push (_stream_readable.js 
at HTTPParser.parserOnBody (_http_common.js:124:22) 

Вот файл я в конечном итоге в моей директории загрузок.

upload_3b2ab28a59131c95015a90a4afe972cd 

Вот часть моих Node.js приложение:

var http = require('http'); 
var fs = require('fs'); 
var path = require('path'); 
var formidable = require('formidable'); 
var fs = require('fs'); 

http.createServer(function(req, res) { 

    console.log('Request received: ' + req.method); 

    if (req.method == 'GET') { 
     fs.readFile("comments-data.json", 'utf8', function(err, data) { 
      if (err) { 
       return console.log(err); 
      } else { 
       res.setHeader("Content-Type", "text/json"); 
       res.setHeader("Access-Control-Allow-Origin", "*"); 
       res.end(data) 
      } 
     }) 
    }; 
    if (req.method == 'POST') { 
      // create an incoming form object 
      var form = new formidable.IncomingForm(); 

      // specify that we want to allow the user to upload multiple files in a single request 
      form.multiples = true; 

      // store all uploads in the /uploads directory 
      form.uploadDir = path.join(__dirname, '/uploads'); 

      // every time a file has been uploaded successfully, 
      // rename it to it's orignal name 
      form.on('file', function(field, file) { 
      fs.rename(file.path, path.join(form.uploadDir, file.name)); 
      }); 

      // log any errors that occur 
      form.on('error', function(err) { 
      console.log('An error has occured: \n' + err); 
      }); 

      // once all the files have been uploaded, send a response to the client 
      form.on('end', function() { 
      res.end('success'); 
      }); 

      // parse the incoming request containing the form data 
      form.parse(req); 
     req.on('data', function(chunk) { 
      var element = JSON.parse(chunk); 
      fs.readFile("comments-data.json", 'utf8', function(err, json) { 
       var array = JSON.parse(json); 
       array.push(element); 
       fs.writeFile("comments-data.json", JSON.stringify(array), function(err) { 
        if (err) { 
         console.log(err); 
         return; 
        } 
        console.log("The file was saved!"); 
       }); 
      }); 
      res.end('{"msg": "success"}'); 
     }); 
    }; 

Вот мой AJAX вызов:

   uploadAttachments: function(commentArray, success, error) { 
         var responses = 0; 
         var successfulUploads = []; 

         var serverResponded = function() { 
          responses++; 

          // Check if all requests have finished 
          if(responses == commentArray.length) { 

           // Case: all failed 
           if(successfulUploads.length == 0) { 
            error(); 

           // Case: some succeeded 
           } else { 
            success(successfulUploads) 
           } 
          } 
         } 

         $(commentArray).each(function(index, commentJSON) { 

          // Create form data 
          var formData = new FormData(); 
          $(Object.keys(commentJSON)).each(function(index, key) { 
           var value = commentJSON[key]; 
           if(value) formData.append(key, value); 
          }); 

          $.ajax({ 
           url: 'http://localhost:8080', 
           type: 'POST', 
           data: formData, 
           cache: false, 
           contentType: false, 
           processData: false, 
           success: function(commentJSON) { 
            successfulUploads.push(commentJSON); 
            serverResponded(); 
           }, 
           error: function(data) { 
            serverResponded(); 
           }, 
          }); 
         }); 
        } 

Это должно принять POST, хранить файл и обновить данные JSON в файле comments-data.json, чтобы указать, куда ушел новый файл.

Заранее благодарен!

Запрос ajax - это функция обратного вызова, которая используется для загрузки вложений на сервер. Первым параметром обратного вызова является commentArray, включая все вложения в качестве моделей комментариев, в которых в файле содержится файл для загрузки. Сервер должен вернуть URL-адрес загруженного файла в поле fileURL. Обратный вызов обеспечивает как успешные, так и обратные вызовы, которые должны вызываться на основе результата с сервера. Обратный вызов успеха принимает массив успешных загрузок в качестве параметра.

+0

Есть ли у кого-нибудь еще, что может помочь? –

ответ

0

Часто ошибка undefined:1 означает, что вы пытаетесь разобрать неправильный JSON. Всегда используйте try-catch, когда вы анализируете данные без безопасности, например. браузером.

req.on('data', function(chunk) { 
    var element; 
    try { 
     element = JSON.parse(chunk); 
    } catch(err) { 
     return // res status 500, console.log(err), smth-else 
    } 

    fs.readFile("comments-data.json", 'utf8', function(err, json) { 
     // here safety data 
     var array = JSON.parse(json); 
     array.push(element); 
     fs.writeFile("comments-data.json", JSON.stringify(array), function(err) { 
      if (err) 
       return console.log(err); 

      console.log("The file was saved!"); 
     }); 
    }); 
}); 

Попробуйте получить данные из формы по

$.ajax({ 
    type: 'POST', 
    url: '/', 
    data: new FormData($('#your-form-id')[0]), 
    processData: false, 
    ... 
+0

Я ценю совет по попытке, хорошо сэкономить. Кроме того, для моего запроса ajax, я использую jquery-плагин - комментарии. Следовательно, это не истинная форма и точно не имеет «идентификатора формы», есть ли у вас какие-либо другие предложения? –

Смежные вопросы