Jak res.sendFile() soubor, který je v jiném adresáři pro webovou aplikaci Express.js?

Mám toto ve složce controllers:

//controler.js
exports.serve_sitemap = (req, res) => {
  res.sendFile("../../sitemap.xml");
  // or
  // res.send(__dirname + "./sitemap.xml")
  // But neither of these work
};

Tato exportovaná funkce je importována do souboru uvnitř routes adresář

const { serve_sitemap } = require('../controllers/indexer')

var router = require('express').Router()

router.get("/sitemap", serve_sitemap)

module.exports = router

V současné době dostávám chybu 404, když se pokouším získat sitmapu na localhost:3000/sitemap

Struktura složek:

Předtím jsem měl to samé v index.js, což je vstupní bod.

app.get("/sitemap", (req, res) => {
   res.sendFile(__dirname + "/sitemap.xml");
});

To fungovalo perfektně, dokud jsem se nerozhodl projekt restrukturalizovat

  • Jak mohu při použití res.send() odkazovat na soubor sitemap.xml, který se nachází v kořenovém adresáři ze souboru, který je v podadresáři?
  • Jak mohu získat absolutní cestu ke kořenovému adresáři projektového adresáře, pak mohu k cestě připojit název souboru. To může vyřešit problém

Možná mi chybí něco jasného. V tom případě mi prosím pomozte.

Jakýkoli návrh vděčně přijat. Předem děkuji

Odpověď

Proč si myslíte, že res.sendFile(__dirname + "./sitemap.xml") fungovalo by to?

Nejprve __dirname + "./sitemap.xml" není způsob, jakým by měly být cesty zřetězeny, měli byste použít join místo toho, zvláště pokud vaše druhá cesta začíná ./ . A neexistuje žádný soubor sitemap.xml v adresáři ovladače:__dirname + "./sitemap.xml" výsledkem by bylo něco jako /path/to/project/src/controller/./sitemap.xml

A proč by měl "../../sitemap.xml" práce. Pokud máte pouze "../../sitemap.xml" je relativní k pracovnímu adresáři, což je ten, kde se (tuším) nachází index.js. Takže "../../sitemap.xml" bude vyřešen na základě /path/to/project , takže /path/to/project/../../sitemap.xml .

Kvůli tomu je buď res.sendFile("./sitemap.xml") (vzhledem k index.js ) nebo res.sendFile(path.join(__dirname, "../../sitemap.xml")) (vzhledem k ovladači).