В ExpressJS, как я должен вызывать асинхронную функцию из метода post?

#javascript #node.js #express

Вопрос:

Это сообщение успешно отправлено в базу данных:

 var express = require("express"); //rest of boilerplate  //the below function posts 'subscribingUserEmail' argument to the DB async function postToDB(subscribingUserEmail) {  await postEmailToDatabase({  email_address: subscribingUserEmail  }); }  postToDB("example@gmail.com");  app.post("/emailList", function(req, res) {  //nothing yet });  

Это не означает:

 var express = require("express"); //rest of boilerplate  //the below function posts 'subscribingUserEmail' argument to the DB async function postToDB(subscribingUserEmail) {  await postEmailToDatabase({  email_address: subscribingUserEmail  }); }  app.post("/emailList", function(req, res) {   //call the same function but inside the post method instead  postToDB("example@gmail.com"); });  

Разница в том, где я выполняю асинхронный вызов функции «postToDB». Есть ли какой-то способ вызвать эту функцию из метода post?

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

1. Есть ли какая-то причина, по которой вы не можете просто перейти req.body непосредственно в run() функцию?

2. @Фил дело в том, что когда я звоню run(«example@gmail.com») над методом публикации, он работает, и я могу видеть электронное письмо в базе данных. Но когда я позову беги(«example@gmail.com») внутри метода post он не сохраняет электронное письмо с аргументом в базе данных.

3. ^ если я смогу это понять, то я могу поменять аргумент на run(req.body.email) внутри метода post и это должно быть хорошо. @Питер Джеффрей

4. Какую отладку вы провели? Некоторые хорошо размещенные console.log() звонки должны, по крайней мере, информировать вас о том, что делает ваше приложение. Вы действительно отправляете POST /emailList запрос в свое экспресс-приложение?

5. Все выглядит нормально. Как вы убедились, что это не работает? Как вы отправляете запрос в свое приложение?

Ответ №1:

Верните результат. Это будет работать при условии, что база данных postEmailToDatabase правильно настроена в вашем приложении

 async function runSubscribe(subscribingUserEmail) {  const response = await postEmailToDatabase({email_address: subscribingUserEmail}); return response; }  app.post("/emailList", async function (req, res) {   //get the email from the frontend's post request  subscribingUserEmail = req.body;   //then pass the email into the top defined function  const result = await runSubscribe(subscribingUserEmail);  // or const result = await postEmailToDatabase({...})    res.send(result) });  

Если ваше тело запроса имеет несколько параметров, вы можете деконструировать его, чтобы сохранить в чистоте

{ subscribingUserEmail } = req.body

Это при условии, что у вас есть этот параметр для вашего объекта тела.

Если вы этого не сделаете, вам понадобится создать резервную копию и сделать

console.log(req.body)

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

1. Исправлено. Спасибо, Фил.

2. runSubscribe Является async , поэтому он вернет обещание, так что это означает, что res.send(result) будет отправлено невыполненное Обещание, а не данные

3. Он await находится внутри async функции, поэтому он «извлечет» разрешенное значение из возвращенного обещания postEmailToDatabase() и вставит его response . Однако, когда вы возвращаетесь response из асинхронного runSubscribe режима , вы в конечном итоге вернете обещание, которое соответствует response значению. Таким образом, вам также нужно будет использовать await обратный вызов после отправки. Если вы это сделаете, то runSubscribe вам не нужно быть асинхронным, и вы можете просто вернуть обещание: return postEmailToDatabase(...) (возможно, стоит runSubscribe полностью удалить функцию)

4. Да, в этом больше смысла — вы все равно можете выполнить рефакторинг runSubscribe , так как он не должны быть асинхронными больше (в настоящее время вы извлекать значение из обещания В response , а затем заворачивая response обратно в обещание), так что вы можете использовать только return postEmailToDatabase({email_address: subscribingUserEmail}); от runSubscribe функции (но если вы сделаете это, то runSubscribe это просто вызов функции и возврат значения, это может быть стоит удаление runSubcribe все вместе)

5. Я относительно новичок. Спасибо, что научил меня Нику 🙂