node js:发送后不能设置标头

时间:2016-07-07 13:57:03

标签: javascript node.js

如何正确发送回复。我想在FTP和Telnet会话之后移动到另一个页面。

甚至尝试过使用res.redirect功能。在使用res.redirect时,我评论了window.location= "SaveRedirect";行,在html页面的javascript中。即便如此,我也会遇到同样的错误。

这里展示代码段,

html中的javascript代码

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

function processSave() {

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

node js code snippet

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)

2 个答案:

答案 0 :(得分:0)

当您尝试在同一个呼叫中多次res.send(或response.send)时会发生这种情况。我相信它与这段代码有关:

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,并再次在ftpFile()

答案 1 :(得分:0)

由于您在同一请求的 app.post(&#34; / Postsave&#34; 功能ftpFile )中多次发送回复,因此会出现此错误

要解决此问题,我建议您将结果(或错误)从ftpfile发送回app.post(即通过回调),然后根据结果或错误发送app.post的响应功能