#node.js #express #middleware
#node.js #экспресс #промежуточный слой
Вопрос:
Я начал работать с express несколько дней назад. Я действительно не понимаю, что происходит в:
const express = require("express") const app = express() app.use(express.static(path.join(), "public")) app.use(require("cors")()) app.listen(3000, () =gt; console.log("running"))
первый пример сработал для меня, но я действительно не понимаю его. и в основном я не понимаю, что происходит app.use()
и что такое промежуточные программы..
кто-нибудь может мне помочь, пожалуйста? я читал много блогов, и я не получил его 🙁
Комментарии:
1. Вы можете рассматривать любой http-запрос как переход через кучу промежуточных программ по порядку. В основном запрос проходит через первое промежуточное программное обеспечение, затем второе, и так далее, пока что-то не отправит ответ. Вы можете добавить свое собственное промежуточное программное обеспечение,написав приложение.используйте((req,res, next)=gt;{любой код, который вы хотите…; далее ();})
Ответ №1:
Предыстория
Есть несколько частей, объясняющих это. Во-первых, off app.use()
ожидает, что ему будет передана функция промежуточного программного обеспечения. Это была бы функция с такой сигнатурой:
app.use(function(req, res, next) { console.log(req.path); // log incoming request path next(); // continue routing to other handlers });
Он принимает другие комбинации параметров, включая начальный путь, и вы также можете передать несколько функций промежуточного программного обеспечения, и он свяжет их вместе, но суть вашего вопроса заключается в одной функции промежуточного программного обеспечения, как показано выше. Эта функция промежуточного программного обеспечения получает три аргумента req
— объект входящего запроса res
, объект исходящего ответа и next
функцию, которую можно вызвать, если вы хотите продолжить маршрутизацию или сообщить об ошибке.
Задача одной из этих функций промежуточного программного обеспечения состоит в том, чтобы использовать входные данные в req
объекте для выполнения какой-либо обработки этих входных данных (в зависимости от цели функции промежуточного программного обеспечения), а затем выполнить одну из трех вещей:
- Отправьте ответ, используя что-то вроде
res.send()
того, в каком случае запрос был обработан, и ответ был отправлен, и дальнейшая маршрутизация не будет выполнена. - Продолжайте маршрутизацию к дальнейшим обработчикам запросов в цепочке, позвонив
next()
. - Прервите маршрутизацию и перейдите к экспресс-обработчику ошибок, позвонив
next(err)
.
Промежуточное программное обеспечение express.static()
Итак, это то, что ожидается от переданной функции app.use()
. Теперь давайте рассмотрим два примера, о которых вы спрашиваете. Давайте начнем с express.static()
:
app.use(express.static(path.join(), "public"))
Во-первых, это неправильное использование express.static()
. Я не совсем уверен, что вы имели в виду, но я предполагаю, что вы имели в виду что-то вроде этого:
app.use(express.static(path.join(__dirname, "public")));
В этом случае express.static()
принимает некоторую информацию о конфигурации, которая является результирующим путем от вызова path.join(__dirname, "public")
, и использует ее для создания пользовательской функции промежуточного программного обеспечения. Таким образом, вызов express.static(path.join(__dirname, "public"))
возвращает функцию, которая ожидает вызова с тремя аргументами промежуточного программного обеспечения, которые мы обсуждали ранее. Это логически идентично этому:
const publicPath = path.join(__dirname, "public"); const myStaticMiddleware = express.static(publicPath); app.use(myStaticMiddleware);
что логически эквивалентно этому:
const publicPath = path.join(__dirname, "public"); const myStaticMiddleware = express.static(publicPath); app.use(function(req, res, next) { myStaticMiddleware(req, res, next); });
Где код был разбит на отдельные шаги, чтобы вы могли видеть каждый шаг отдельно.
И, если вы еще не знали, суть express.static()
промежуточного программного обеспечения заключается в том, чтобы обслуживать статические файлы из указанного каталога, если входящий запрос точно соответствует имени файла в этом указанном каталоге и имеет соответствующий тип файла.
Промежуточное программное обеспечение cors
Для вашего второго примера:
app.use(require("cors")())
Давайте снова разберем это на отдельные шаги:
const cors = require("cors"); // load cors module const corsMiddleware = cors(); // create cors middleware function app.use(corsMiddleware); // register middleware with Express server
Который может быть расширен до:
const cors = require("cors"); const corsMiddleware = cors(); app.use(function(req, res, next) { corsMiddleware(req, res, next); });
Просто чтобы показать вам, что corsMiddleware вызывается с этими тремя аргументами.
Цель этого конкретного промежуточного программного обеспечения состоит в том, чтобы помочь настроить ответ на этот запрос таким образом, чтобы запросы перекрестного происхождения принимались.
Комментарии:
1. Я случайно удалил предыдущее сообщение.. :Спасибо Вам! я не ожидал такого красивого ответа. Ты все мне ясно объяснил. Да, у вас есть галочка 🙂