#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. Я относительно новичок. Спасибо, что научил меня Нику 🙂