Синтаксическая ошибка: неожиданный токен ‘<' в инструкции require ("file_path")

#javascript #node.js

#javascript #node.js

Вопрос:

В моем node.js приложение Я возвращаю некоторый HTML-код из запроса. Я использую express, поэтому я использую оператор require(), чтобы получить его в переменной и вернуть его с запросом. Все это работало нормально, пока внезапно не перестало работать, и я сознательно ничего не менял.

Ошибка

 <!DOCTYPE html>
^

SyntaxError: Unexpected token '<'
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (path/controllers/homepage.js)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (path/routes/home.js)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
 

Я выделил код-виновник в первой строке следующего:

 const page = require("../Front End/Index.html");

exports.getHome = (req, res) => {
    res.sendFile(page);
}
 

Другие вопросы по переполнению стека указывают на то, что HTML-файл является проблематичным, поэтому ниже приведен сегмент (также на который указывает ошибка)

 <!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="Index.css">
    <title>Wildfire</title>
    <link rel="icon" href="Assets/wildfirelogo64.png">
</head>
 

Что я делаю не так?

Комментарии:

1. nodejs.org/api/fs.html

Ответ №1:

require() может использоваться для загрузки и запуска файлов Javascript или для чтения и анализа файлов JSON. Он не предназначен для загрузки обычных текстовых файлов. Вы получаете ошибку о < символе, потому что он пытается проанализировать ваш HTML как Javascript, и, очевидно, это просто выдает синтаксическую ошибку Javascript.

Если вы хотите предварительно загрузить фрагмент HTML, вы можете использовать fs.readFileSync() :

 const fs = require('fs');
const page = fs.readFileSync('../Front End/Index.html');

exports.getHome = (req, res) => {
    res.send(page);
}
 

Или вы можете просто позволить Express обрабатывать чтение файла за вас:

 exports.getHome = (req, res) => {
    res.sendFile("../Front End/Index.html", { root: __dirname });
}
 

Комментарии:

1. Когда я выполняю первый вариант, я получаю сообщение об ошибке «TypeError: путь должен быть строкой к res.sendFile», а когда я выполняю второй вариант, я получаю сообщение об ошибке «TypeError: путь должен быть абсолютным или указывать root для res.sendFile». Есть ли способ, которым я могу отправить файл без абсолютного пути или используя первый вариант?

2. @skelegorg — Мой первый вариант не содержит res.sendFile() . Если вы имеете в виду второй вариант в моем ответе, то посмотрите Пересмотр моего ответа и настройте root параметр по мере необходимости для вашей структуры каталогов.

Ответ №2:

Вы не можете require использовать html-файл, синтаксис HTML не может выполняться как синтаксис JS.

Если вы хотите отправить HTML-файл клиенту с помощью экспресс-приложения, просто следуйте какому-нибудь простому примеру в Интернете:

 
exports.getHome = (req, res) => {
    res.sendFile("../Front End/Index.html"); // send it
}