2016-07-07 4 views
0

응답을 올바르게 보내는 방법. 나는 FTP와 텔넷 세션 후에 다른 페이지로 이동하는 것을 좋아한다.노드 js : 보낸 후 헤더를 설정할 수 없습니다.

res.redirect 함수도 사용해 보았습니다. res.redirect를 사용하는 동안 나는 html 페이지의 javascript에서 window.location= "SaveRedirect"; 줄을 주석 처리했습니다. 그럼에도 불구하고 나는 같은 오류를 낳는다. 여기

코드 조각을 제시

,

HTML에서 자바 스크립트 코드는

IPData ={ 
      "DeviceIpAddr": "192.168.1.2" 
     }; 

function processSave() { 

     $.post("PostSave", IPData, function(data) { 
       window.location= "SaveRedirect"; 
     }); 
return true; 
} 

노드 JS 코드는

app.get('/SaveRedirect', function (req, res) { 
    res.sendFile(__dirname + "/" + "Page2.htm"); 
}) 

var bodyParser = require('body-parser'); 
var testJsonEncoder = bodyParser.json(); 
urlEncoded = bodyParser.urlencoded({ extended: true }); 

app.post('/PostSave', testJsonEncoder,urlEncoded, function(request, response){ 

    var LoginData = JSON.stringify(request.body, null, 4); 
    console.log(LoginData); 
    FormDataObj = JSON.parse(LoginData); 
    gDeviceIpAddress = FormDataObj.DeviceIpAddr; 
    console.log("IP Address" + gDeviceIpAddress); 

    console.log("FTP to linux box..."); 
    ftpFile(gDeviceIpAddress, "PUT", "temp_data.json", response); 
    console.log("FTP temp_data file to linux box... Done!"); 
    TelnetLinux(gDeviceIpAddress); 
    console.log("Telnet to linux box... Done!"); 
    response.send("just to send response"); 
    //response.json(LoginData); 

}); 


function ftpFile(ftpIPAddr, operation, filename, resp) { 

    console.log("ftpIPAddr = " + ftpIPAddr); 

    ftpConfig.host = ftpIPAddr; 

    // Handle error 

    ftpClient.on("error", function (err) { 
     console.log(" - ERROR HANDLE - \n"); 

      console.log(err); 

      resp.send("FAIL: " + err.message); 
      ftpClient.end(); 


    }); 


    // Handle error 
    ftpClient.on("ready", function() { 
     console.log("Connected....\n"); 
     if(operation == "GET") { 
      console.log("filename : " + filename); 
      ftpClient.get(filename, function(err, stream) { 
       if (err) 
       { 

        resp.send("FAIL: " + err.message + " - " + filename); 
        ftpClient.end(); 

        //throw err; 
       } 
       else { 
        stream.once('close', function() { ftpClient.end(); }); 
        stream.pipe(fs.createWriteStream('test_data.json')); 

        resp.send("SUCCESS: file received"); 
        ftpClient.end(); 


       } 
      }); 
     } 

     if(operation == "PUT") { 
      ftpClient.put(filename, filename, function(err) { 
       if (err) { 
        resp.send("FAIL: " + err.message + " - " + filename); 
        ftpclient.end(); 
        throw err; 

       } 
       else { 
        resp.send("SUCCESS: file sent"); 
        ftpClient.end(); 
       } 
      }); 
     } 
    }); 

    ftpClient.connect(ftpConfig); 
} 



function TelnetLinux(deviceIPAddr) { 

    var telnetParams = { 
     host: deviceIPAddr, 
     port: 23, 
     username: "webtest", 
     password: "test123", 
     shellPrompt: '$', 
     timeout: 1500, 
     // removeEcho: 4 
    }; 

    cmd = "ls"; 

    console.log("Telnet Address : " + deviceIPAddr); 
    telnetClient.on('ready', function(prompt) { 
     telnetClient.exec(cmd, function(err, response) { 
     //console.log(response); 
     console.log("Cmd executed !"); 
     }); 
    }); 

    telnetClient.on('timeout', function() { 
     console.log('telnet socket timeout!') 
     telnetClient.end(); 
    }); 

    telnetClient.on('close', function() { 
     console.log('telnet connection closed'); 
    }); 

    telnetClient.connect(telnetParams); 
} 

오류 :

c:\WebTest>node webapp.js 
Example app listening at http://:::8081 

IP Address192.168.1.2 
FTP to linux box... 
ftpIPAddr = 192.168.1.2 
FTP temp_data file to linux box... Done! 
Telnet Address : 192.168.1.2 
Telnet to linux box... Done! 
Cmd executed ! 
telnet socket timeout! 
telnet connection closed 
Connected.... 

_http_outgoing.js:346 
    throw new Error('Can\'t set headers after they are sent.'); 
    ^

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11) 
    at ServerResponse.header (c:\WebTest\node_modules\express\lib\response.js:719:10) 
    at ServerResponse.send (c:\WebTest\node_modules\express\lib\response.js:164:12) 
    at c:\WebTest\webapp.js:222:11 
    at Object.cb (c:\WebTest\node_modules\ftp\lib\connection.js:1017:13) 
    at Parser.<anonymous> (c:\WebTest\node_modules\ftp\lib\connection.js:117:20) 
    at emitTwo (events.js:100:13) 
    at Parser.emit (events.js:185:7) 
    at Parser._write (c:\WebTest\node_modules\ftp\lib\parser.js:59:10) 
    at doWrite (_stream_writable.js:301:12) 
    at writeOrBuffer (_stream_writable.js:287:5) 
    at Parser.Writable.write (_stream_writable.js:215:11) 
    at Socket.ondata (c:\WebTest\node_modules\ftp\lib\connection.js:273:20) 
    at emitOne (events.js:90:13) 
    at Socket.emit (events.js:182:7) 
    at readableAddChunk (_stream_readable.js:153:18) 
+0

클라이언트에 두 번 응답을 보내고 응답을 보내려면 response.send ("응답 만 보내면"); – rpadovani

+0

제거하더라도 페이지 2로 이동하지 않고 HTML 페이지에서 오류가 발생합니다 " 리소스를로드하지 못했습니다 : http : // localhost : 8081/PostSave 서버가 404 상태로 응답 함 (찾을 수 없음) – SKay

답변

0

이 때 일어나는 tr 동일한 호출에서 res.send (또는 response.send) 번을 여러 번 수행합니다. ftpFile()

0

당신이 응용 프로그램에서 응답을 여러 번 전송되기 때문에 다시

app.post('/PostSave', testJsonEncoder, urlEncoded, function(request, response) { 

    var LoginData = JSON.stringify(request.body, null, 4); 
    console.log(LoginData); 
    FormDataObj = JSON.parse(LoginData); 
    gDeviceIpAddress = FormDataObj.DeviceIpAddr; 
    console.log("IP Address" + gDeviceIpAddress); 

    console.log("FTP to linux box..."); 
    ftpFile(gDeviceIpAddress, "PUT", "temp_data.json", response); 
    console.log("FTP temp_data file to linux box... Done!"); 
    TelnetLinux(gDeviceIpAddress); 
    console.log("Telnet to linux box... Done!"); 
    response.send("just to send response"); 
    //response.json(LoginData); 

}); 

당신은이 함수의 끝에 response.send을하고있는, 그리고 : 나는 코드의이 비트와 함께 할 가지고 있다고 생각합니다 .post ("/ Postsave"기능 같은 요청에 대한 FTPFILE,이 오류가 발생합니다.

는이 문제를 해결하려면, 당신은 응용 프로그램에 다시 FTPFILE에서 결과 (또는 오류)를 보내 제안 . post (즉, cal을 통해) lback) 다음 결과 또는 오류를 기반으로 app.post 함수에서 응답을 보냅니다.

관련 문제