Nodejs ждут нескольких вызовов базы - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь создать ответ, в котором требуется два вызова базы данных. В настоящее время у меня возникают проблемы с функцией асинхронной / ожидающей работы Node.js.

Вот класс вызова:

router.get('/:id/mailings', async (req, res) => {

    try {
        const pool = await poolPromise;
        let id = req.params.id;

        const mailings = await getMailings(pool, id);
        const subjectLines = await getSubjectLines(pool, id);

        mailings['subjects'] = await subjectLines;

        await res.json(mailings)
    } catch (err) {
        res.status(500)
        res.send(err.message)
    }
})

Вот две названные функции:

async function getMailings(pool, campaignId) {
    const result = await pool.request()
        .query(`
    SELECT [CampaignId] AS campaignId
        ,[MailingId] AS mailingId
        ,[Description] AS description
        ,[HtmlBody] AS htmlBody
        ,[Subjects] AS subjects
        ,[FromLines] AS fromlines
        ,ISNULL(ImageCount, 0) AS imageCount
        ,[InsertTimestamp_utc] AS insertTimestampUTC
    FROM [CampaignHTMLmessage] WHERE [CampaignId] =` + campaignId);

    return result.recordset;
}

async function getSubjectLines(pool, campaignId) {
    const result = await pool.request()
        // .input('input_parameter', sql.Int, req.query.input_parameter)
        .query(`
        SELECT 
            [SubjectLine] as subjectLine
        FROM CampaignSubjectLines WHERE campaignid =` + campaignId);

    return result.recordset;
}

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

1 Ответ

0 голосов
/ 22 мая 2019

Попробуйте это:

  var dataToUpdate;
  await asyncFunction().then( function(data){
      dataToUpdate = data;
  })

  var secondPieceOfData;
  await doStuffWith(dataToUpdate).then(function(data){
      secondPieceOfData = data;
  }

Ваша асинхронная функция должна возвращать обещание, которое вы возвращаете, выполняя resol (valueToReturn), и которое передается в обратном вызове внутри .then ().

Вот как должна выглядеть ваша асинхронная функция:

async function doStuffWith(dataPath){ 
  return new Promise( function(resolve, reject){
     fs.readFile(dataPath, function(err, bfr){ 
        resolve({results: JSON.parse(bfr)}); 
     }) 
  })
}

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

...