NodeJS: как использовать аргументы типа req, res, result в функциях? - PullRequest
2 голосов
/ 18 июня 2019

Я довольно новичок в JS, особенно в Node и Express.Я следую некоторым урокам о том, как создать API, и в то же время изучаю специальные функции JS, такие как let / const / var, функции стрелок и т. Д.

Во многих уроках я видел такие вещи:

somecode.then((result) => {someothercode})

С: "somecode" является, например, запросом на получение

Является ли "result" именем возвращаемого значения или это соглашение, которое использует JS developper?Под этим я подразумеваю, например, работает ли это?

somecode.then((foo) => {someothercode})

Также для переменных req, res что это означает?

app.get("/users/:userId", [
        usersController.getById
    ]);

Вот функция getById (снова используя"result"):

exports.getById = (req, res) => {
    userModel.findById(req.params.userId).then((result) => {
        res.status(200).send(result);
    });
};

метод getById, определенный в контроллере, нуждается в (req, res), означает ли это, что когда я вызываю его, как в коде выше, неявно используются аргументы req и res?

Также необходим параметр:

req.params.userId 

, который находится в URL-адресе маршрута, как он передается в другой файл?У меня есть файл route.js, который использует файл controller.js, который использует model.js.Как параметр переходит от маршрута к контроллеру?

И это не сработает, если я правильно изменю имя параметра?Например:

req.params.id

Извините за длинный пост, я пытаюсь понять логику JS, чтобы получить хорошие привычки и написать чистый код.

Спасибо!

Ответы [ 4 ]

1 голос
/ 18 июня 2019

Похоже, вы боретесь с пониманием функций обратного вызова. Рассмотрите следующий код, затем, пожалуйста, откройте исходный код для пакетов, которые вы используете. и похоже, что вы используете express.js

function something(callback) {
  var x = 5;
  var y = 'anything';
  callback(x, y);
}

something(function(req, res) {
  console.log(req);
  console.log(res);
});

создается функция что-то, и внутри области действия этой функции, var x и y создаются с любым типом. затем, когда мы вызываем или используем какую-то функцию, мы передаем функцию как переменную, которая передается как переменная callback, тогда ее можно использовать, поскольку она является функцией, поэтому мы вызываем callback с x и y, которые могут быть буквально любыми значение и для эффекта, я передаю обратно число и строку как req и res.

1 голос
/ 18 июня 2019

Является ли "result" именем возвращаемого значения или это соглашение, которое использует JS developper?

result - это имя новой переменной, которую вы создаете для представления значения, переданного из разрешения Promise. Да, ваш foo пример будет работать.

(req, res) => {} - это то же самое (в основном), что и функция, которая выглядит следующим образом:

function getById(req, res) {...}

req и res просто представляют значения, которые будут переданы этой функции. Их так же легко можно было бы назвать (foo, bar).

1 голос
/ 18 июня 2019

Это просто соглашение.Обратите внимание, что код:

somecode.then((result) => {someothercode});

на самом деле:

somecode.then(myFunction);

Поскольку somecode - это Promise, ваша функция может вызываться с нулевым или одним аргументом.Вы должны назвать этот аргумент:

function myFunction (foo) {
    // use foo here
}

somecode.then(myFunction);

Конечно, в отличие от некоторых других языков, javascript не заставляет вас называть вашу функцию.Вы можете просто использовать безымянную (анонимную) функцию:

somecode.then(function(mango) { /* use mango here */ })

Стрелочные функции - это новый синтаксис, позволяющий писать анонимные функции в более коротком стиле (он также ведет себя немного по-разному в отношении объема и значенияthis)

Express.js и http.Server

В библиотеке узла http.Server и платформе Express.js каждый запрос к серверу будет вызывать определенную вами функцию и передавать ей два аргумента:объект запроса и объект ответа.Переменные req и res - это просто соглашения, которые люди используют при написании своих собственных функций обработчика запросов.Вы можете назвать их как угодно.Например, вы можете вместо этого использовать request и response или rx и tx:

app.get('/say/hello', (rx, tx) => tx.send('Hello'));

Сколько аргументов я пишу с помощью функции обратного вызова ??

лучший способ узнать это прочитать документацию модуля, который вы используете.Это не только способ узнать - вы, конечно, можете прочитать исходный код.Но часто легче читать документацию.Из-за этого модули javascript имеют тенденцию иметь действительно хорошую документацию (в противном случае они были бы непригодны для использования и игнорировались бы сообществом).

Express.js фактически передаст три аргумента вашему обратному вызову (не два !!) - request, response и next, где next - это функция, которую вы можете вызвать, если хотите, чтобы Express продолжил обработку вместо ответа на запрос.Одна интересная особенность javascript - это то, что вам разрешено вызывать функции с меньшим или большим количеством аргументов, и это не считается синтаксической ошибкой:

function example (x) {}
example(); // not an error
example(1); // not an error
example(1,2,3,4); // also not an error

Express использует эту функцию, всегда вызывая ваш обратный вызов с тремя аргументами, одновременно позволяяобъявить обратный вызов только с двумя аргументами, если вам не нужен третий аргумент next.

1 голос
/ 18 июня 2019

Является ли "result" именем возвращаемого значения или это соглашение, которое использует JS developper?Под этим я подразумеваю, например, работает ли это?

Из моего опыта да - result часто используется.Часто вы видите такие вещи, как value, response, но в конечном итоге это может быть все, что вы определяете.Я бы порекомендовал придерживаться соглашения, а также проверить учебник Обещание MDN , если вы начинаете с понимания асинхронных операций NodeJS.

Также для переменных req, res что это делаетзначит?

app.get("/users/:userId", [
        usersController.getById
    ]);

Это цепочка промежуточного программного обеспечения .Обратитесь к Express docs для получения дополнительной информации.

метод getById, определенный в контроллере, нуждается в (req, res), означает ли это, когда я вызываю его как код выше, аргументы req и res используются неявно?Также ему нужен параметр:

req.params.userId 

, который находится в URL-адресе. Это не сработает, если я изменю имя параметра, верно?например:

req.params.id

Да, это использует именованный параметр.Без полного кода маршрутизатора трудно понять, как метод getById связан с определенным маршрутом. Экспресс-документация по маршрутизации , вероятно, станет хорошим началом для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...