Как выполнить код после завершения функции обратного вызова?

Мне нужно знать, как выполнить строку(и) кода после завершения каждой функции обратного вызова.

Я использую пакет rcon для отправки команды rcon на выделенный сервер Half-Life (HLDS), на котором размещен сервер Counter Strike 1.6, и получаю ответ. Проблема в том, что иногда ответ делится на части (я думаю, это из-за соединения с UDP, TCP не работает). Сначала я использовал res.send() в conn.on() с функцией обратного вызова "ответ" события, но я получил сообщение об ошибке, говорящее, что не могу отправлять заголовки HTTP. Я узнал о res.write(), он может сохранить то, что мне нужно, а затем использовать res.send() позже. Но я не знаю, где находится подходящее место в сообщении, я могу использовать res.send() после того, как все «ответы» вернулись. Я пытался использовать команду после conn.connect() и других мест, но это не сработало.

      const express = require('express');
var Rcon = require('rcon');

const app = express();
const port = 3000;
app.use(express.urlencoded({extended: true}));

app.get("/", function(req,res){
  res.sendFile(__dirname + "/index.html");
});

app.post("/", function(req, res) {

    var resp = "";
    var ip = req.body.serverip;
    var pass = req.body.pass;
    var command = req.body.command;

    var options = {
      tcp: false,
      challenge: true
    };

    var conn = new Rcon(ip, 27015, pass, options);

    conn.on('auth', function () {
      // You must wait until this event is fired before sending any commands,
      // otherwise those commands will fail.
      console.log("Authenticated");
      console.log("Sending command:" + command);
      conn.send(command);

    });

    res.setHeader("Content-Type", "text/html; charset=UTF-8");
    res.write("<!DOCTYPE html><html><body>")
    conn.on('response', function(str)  {
        console.log("Response: "+str);
        res.write(str);
    });

    conn.on('error', function (err) {
      console.log("Error: " + err);
    });

    conn.on('end', function () {
      console.log("Connection closed");
      process.exit();
    });

    conn.connect();
    res.end("Done</body></html>");
});

app.listen(port, function(){
  console.log("Server is listening on port " +port);
});


});

1 ответ

Если вы хотите «поточить» части ответа на HTML-страницу, вы можете использовать следующее:

      res.setHeader("Content-Type", "text/html; charset=UTF-8");
res.write("<!DOCTYPE html><html><body>"); // start an HTML page
conn.on('response', function(str) {
  res.write(str);
});

Элементарное начало HTML-страницы, которое вы выдаете еще до того, как придет первый ответ, заставляет браузер отображать текст входящих ответов по мере того, как вы записываете их на страницу.(См. также здесь.)

Если вы можете распознать последний ответ, вы можете закончить страницу с

      conn.on('response', function(str) {
  res.write(str);
  if (str is the last response)
    res.end("</body></html>");
});

но «поток ответов» работает, даже если нет «последнего» ответа: в этом случае браузер продолжает ждать еще, поэтому страница никогда не заканчивается, но вы все равно можете прочитать то, что на ней есть.

Другие вопросы по тегам