Как установить пользовательский таймаут на http get nodeJS - PullRequest
0 голосов
/ 28 января 2020

Не могу найти документацию о том, как установить пользовательское время ожидания для данного запроса в NodeJS (с Express)?

Следующее не работает ....:

https.get("https://externalurl.com", { timeout: 1000 }, (res) => {
    resp.on("timeout", () => {
        console.log("Never fired");
    });
});

Это тоже не работает:

https.get("https://externalurl.com", (req, res) => {
    req.setTimeout(1000);
});

Это тоже не работает ...

https.get("https://externalurl.com", (res) => {

})
.setTimeout(1000);

Всегда ждет более 1 се c, прежде чем выдать ошибку

Может кто-нибудь помочь? Есть ли "официальный" способ установить пользовательское время ожидания для данного запроса?

Мой полный server.ts

// Express server
const app = express();

const PORT = process.env.PORT || 80;
const DIST_FOLDER = join(process.cwd(), "dist/browser");

// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const {
  AppServerModuleNgFactory,
  LAZY_MODULE_MAP,
  ngExpressEngine,
  provideModuleMap
} = require("./dist/server/main");

// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine(
  "html",
  ngExpressEngine({
    bootstrap: AppServerModuleNgFactory,
    providers: [provideModuleMap(LAZY_MODULE_MAP)]
  })
);

app.set("view engine", "html");
app.set("views", DIST_FOLDER);

// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve static files from /browser
app.get(
  "*.*",
  express.static(DIST_FOLDER, {
    maxAge: "1y"
  })
);

// All regular routes use the Universal engine
app.get("/", (req, res) => {
  res.render("index", { req });
});

app.get("/myCustomRoute", (req, res) => {
  const protocol: string = req.query.myUrl.split(":")[0];
  let httpProtocol;

  if (protocol === "http") {
    httpProtocol = require("http");
  } else if (protocol === "https") {
    httpProtocol = require("https");
  }

  try {
    // THIS IS THE REQUEST I WANT TO CUSTOMIZE THE TIMEOUT
    httpProtocol
      .get(
        `${req.query.myUrl}/custom/custom/custom/custom.php?param=${req.query.myParam}`,
        { rejectUnauthorized: false },
        (myRes) => {
          let data = "";

          // A chunk of data has been received.
          myRes.on("data", (chunk) => {
            data += chunk;
          });

          // The whole response has been received
          myRes.on("end", (resXml) => {
            switch (myRes.statusCode) {
              case 403:
                res.status(403).send("Forbidden");
                break;
              case 404:
                res.status(404).send("Not found");
                break;
              default:
                res.send(data);
                break;
            }
          });
        }
      )
      .on("error", (err) => {
        console.log(err);
        res.status(500).send("custom error");
      });
  } catch (e) {
    console.log(e);
    res.status(500).send("custom error");
  }
});

// Start up the Node server
app.listen(PORT, () => {
  console.log(`Node Express server listening on http://localhost:${PORT}`);
});

1 Ответ

1 голос
/ 29 января 2020

Чтобы переопределить тайм-аут по умолчанию, вам нужно сделать что-то вроде этого, Это работает для меня,

// Start up the Node server
app.listen(PORT, () => {
  console.log(`Node Express server listening on http://localhost:${PORT}`);
}).setTimeout(20000); //Time is in msecs

Чтобы установить для указанного c маршрута, вам нужно установить тайм-аут ответа, а не тайм-аут запроса необходимо переопределить время отклика:

 app.post('/xxx', function (req, res) {
   res.setTimeout(500000); //Set response timeout
});
...