【问题标题】:Nodejs await for multiple database callsNodejs等待多个数据库调用
【发布时间】:2019-05-23 00:50:34
【问题描述】:

我正在尝试构建一个需要两个数据库调用的响应。目前我在使用 Node.js 的 async/await 功能时遇到问题。

这是调用类:

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;
}

响应是一个空数组,假设响应是在数据库请求完成之前发送的。

【问题讨论】:

    标签: node.js asynchronous async-await


    【解决方案1】:

    试试这个:

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

    你的异步函数应该返回一个你通过resolve(valueToReturn)返回的promise,并在.then()的回调中传递。

    这就是你的异步函数应该是这样的:

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

    我很确定引擎会自动创建返回新承诺,但恕我直言,最好是明确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 2019-11-19
      • 2019-12-04
      • 2021-10-10
      • 2018-05-27
      • 2021-08-21
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多