Express JS не может получить доступ к нескольким статическим страницам

Он определяет новый тип, синтаксис называется обобщенным типом алгебраических данных .

Он более общий, чем обычный синтаксис. Вы можете написать любое стандартное определение типа (ADT) с помощью GADT:

data E a = A a | B Integer

можно записать как:

data E a where
  A :: a -> E a
  B :: Integer -> E a

Но вы также можете ограничить то, что находится на правой стороне:

data E a where
  A :: a -> E a
  B :: Integer -> E a
  C :: Bool -> E Bool

, что невозможно с нормальным объявлением ADT.

Для получения дополнительной информации проверьте Haskell wiki или это видео .


Причина - безопасность типа. ExecutionAST t должен быть типом операторов, возвращающих t. Если вы напишете обычный ADT

data ExecutionAST result = Return result 
                         | WriteRegister M_Register Word8
                         | ReadRegister M_Register
                         | ReadMemory Word16
                         | WriteMemory Word16
                         | ...

, тогда ReadMemory 5 будет полиморфным значением типа ExecutionAST t, а не мономорфным ExecutionAST Word8, и это будет проверять тип:

x :: M_Register2
x = ...

a = Bind (ReadMemory 1) (WriteRegister2 x)

Этот оператор должен прочитать память из местоположения 1 и записать в регистр x. Однако чтение из памяти дает 8-битные слова, а для записи в x требуются 16-битные слова. Используя GADT, вы можете быть уверены, что это не скомпилируется. Ошибки времени компиляции лучше ошибок во время выполнения.

GADT также включают экзистенциальные типы . Если вы попытались написать bind таким образом:

data ExecutionAST result = ... 
                           | Bind (ExecutionAST oldres)
                                  (oldres -> ExecutionAST result)

, то он не будет компилироваться, поскольку «oldres» не находится в области видимости, вам нужно написать:

data ExecutionAST result = ...
                           | forall oldres. Bind (ExecutionAST oldres)
                                                 (oldres -> ExecutionAST result)

If вы запутались, проверьте связанное видео для более простого, родственного примера.

0
задан Sen123 18 March 2019 в 18:45
поделиться

5 ответов

Если вы запросите /about.html, то:

  • Это будет соответствовать app.use(express.static('public')); (потому что это соответствует каждому URL)
  • Это не будет соответствовать [ 112] (потому что это отличается)
  • Это будет соответствовать app.get('/about.html', (req, res) => { (потому что это соответствует ему явно)

app.use(express.static('public')); не найдет about.html или [ 116], поскольку в каталоге public нет файлов с таким именем.

res.sendFile(path.resolve(__dirname, 'pages/about.html')); найдет about.html, потому что путь ему явно соответствует.

0
ответ дан Quentin 18 March 2019 в 18:45
поделиться

Просто вы меняете путь следующим образом

Например, res.sendFile(path.resolve(__dirname, 'public/pages/', 'index.html'));

.
0
ответ дан rajmobiapp 18 March 2019 в 18:45
поделиться

переместите папку своих страниц в общую папку, затем:

app.use(express.static(__dirname + '/public'));
0
ответ дан Jaber Alshami 18 March 2019 в 18:45
поделиться

попробуйте так:

app.use(express.static(__dirname + '/public'));
app.use('/public', express.static(__dirname + '/public'));

и

res.sendFile(path.resolve(__dirname+'/public/', 'pages/post.html'));
0
ответ дан Saurabh Mistry 18 March 2019 в 18:45
поделиться

Вам необходимо зарегистрировать статический pages каталог

app.use(express.static(__dirname + '/pages'));

Ваш маршрут должен работать.

app.get('/about.html', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'about.html'));
});
0
ответ дан ejaz 18 March 2019 в 18:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: