2017-02-17 12 views
1

Как сохранить HTTP-запрос в файле? Я использую nodejs как сервер. Я передачи данных через AJAX, как это показано нижеНапишите http-запрос в файле с nodejs

user_info = 
    { 
     system_info: [ 
      {'browesr': browser}, 
      {'brower-version': version}, 
      {'cookies': cookieEnabled}, 
      {'os': os}, 
      {'os-version': osVersion} 
     ] 
    } 
} 

$.ajax({ 
    url: 'http://127.0.0.1:4560', 
    data: {"info" : JSON.stringify(user_info)}, 
    type: 'POST', 
    jsonCallback: 'callback', 
    success: function(data) { 
     var ret = jQuery.parseJSON(data); 
     $('#lblResponse').html(ret.msg); 
     console.log('success'); 
    }, 
    error: function(xhr, status, error) { 
     console.log('Error:' + error.message); 
     $('#lblResponse').html('Error connecting to the server.'); 
    } 
}); 

метод пост корректно работает и в стороне сервера данные получают слишком. моей проблемой является сохранение данных! Я ищу, и я нахожу что-то о потоковой передаче. это мой код сервера nodejs.

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

http.createServer(function (req, res) { 

    console.log('Request Received'); 

    res.writeHead(200, { 
     'Context-Type': 'text/plain', 
     'Access-Control-Allow-Origin': '*' 
    }); 

    req.on('data', function (chunk) { 
     var rstream = fs.createReadStream(JSON.parse(chund)); 
     var wstream = fs.createWriteStream('info.txt'); 
     rstream.pipe(wstream); 
     str += chunk; 
     console.log('GOT DATA'); 
    }); 

    res.end('{"msg": "OK"}'); 
}).listen(4560, '127.0.0.1'); 
console.log('Server running at http://127.0.0.1:4560/'); 

Я использую фс модуль и потоковое, но не работало вообще, «info.txt» рядом код сервера в том же каталоге.

Может ли кто-нибудь мне помочь?

ответ

1

Вы больше всего там. Вот рабочий пример, основанный на коде:

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

http.createServer(function (req, res) { 

    console.log('Request Received'); 

    var body = ''; 

    res.writeHead(200, { 
     'Context-Type': 'text/plain', 
     'Access-Control-Allow-Origin': '*' 
    }); 

    req.on('data', function (chunk) { 
     body += chunk; 
    }); 

    req.on('end', function() { 
     fs.writeFile('file.json', body, 'utf8'); 
     res.end('{"msg": "OK"}'); 
    }) 

}).listen(4560, '127.0.0.1'); console.log('Server running at http://127.0.0.1:4560/'); 

Это позволит сохранить содержимое, которое вы отправить его в файл с именем «file.json».

Кроме того, необходимо сделать несколько незначительных изменений на ваш запрос Ajax:

url: 'http://127.0.0.1:4560', 
data: JSON.stringify({"info" : user_info}), 
contentType: "application/json", 
type: 'POST', 
jsonCallback: 'callback', 

Если вы хотите изменить то, что вы пишете в файл, то вы могли бы так что-то вроде:

req.on('end', function() { 
    var parsedJson = JSON.parse(body); 
    fs.writeFile('file.json', JSON.stringify(parsedJson.info), 'utf8'); 
    res.end('{"msg": "OK"}'); 
}) 

Если вы хотите добавить файл, а не перезаписывать его, то вы могли бы сделать что-то вроде:

req.on('end', function() { 
    var parsedJson = JSON.parse(body); 
    // Read and parse the JSON file 
    var file = require('file.json'); 
    file[parsedJson.someKindOfID] = parsedJson; 
    fs.writeFile('file.json', JSON.stringify(file), 'utf8'); 
    res.end('{"msg": "OK"}'); 
}) 

Но это зависит от вашей структуры данных в файле.

+0

Спасибо, друг! Только одна проблема, когда я открываю файл.json, данные сохраняются следующим образом: info =% 7B% 22system_info% 22% 3A% 5B% 7B% 22browser ...., почему не отображали данные, как обычный json? –

+0

В вашем запросе Ajax попробуйте 'data: JSON.stringify ({" info ": user_info})' и установите 'contentType:" application/json "' – dan

+0

Правильно! , но еще одна проблема, когда вы открываете страницу в новой операционной системе или веб-браузере, сервер удаляет предыдущий json и записывает новое, как я могу добавить данные? –