2016-08-24 2 views
0

У меня есть код на основе Sequelize, который отлично работает в проекте Node.js. Я переместил этот код в обработчик AWS Lambda и тестировал его с помощью модуля node-lambda. Теперь код Sequelize кажется пропущенным. Я не уверен, что обещание не обрабатывается до того, как закончится Лямбда, или если мне не хватает чего-то другого. Следующий код пропускает «во время» console.log, как показано на следующем рисунке.Код Sequelize не выполняется внутри AWS Lambda

var models = require('./models'); 

exports.handler = function(event, context, callback) { 
    console.log("Before"); 

    var body = JSON.parse(event.body); 

    // Find the device ID from the devices table 
    models.Device.findOne({where: {device_uuid: body.device_uuid}, attributes: ['id']}).then(function(device) { 
     console.log("During"); 

     // Make sure that we got a device back 
     if (device === null) { 
      console.log("Device not found - could not insert data"); 
      return; 
     } 
     else { 
      console.log("Device found, inserting data - " + body.device_uuid); 

      //Insert the data for this device 
      models.Data.create({ 
       device_id: device.id,    
       data: body.data 
      }); 
     } 
    }); 

    console.log("After"); 

    callback(null, "{\"status\": \"success\"}"); 
} 

Урожайность ...

Before 
After 
Success: 
"{\"status\": \"success\"}" 

Любые идеи о том, где я буду неправильно? Я использую Node v5.9.0.

+0

Я обнаружил, что если я удалю ссылку обратного вызова, что код Sequelize работает нормально. – user2174937

ответ

3

Я только начал играть с apigateway/lambda и sequelize, но насколько я знаю об узле и sequelize, обратный вызов должен находиться внутри блока «then».

Вчера выяснилось, что если вы используете обратный вызов (null, successData), производительность была очень плохой (> 11 секунд на Select top 1). Необходимо было изменить флаг context.callbackWaitsForEmptyEventLoop = false, и теперь вызов api занимает 24 мс.

//Important to improve performance! 
    context.callbackWaitsForEmptyEventLoop = false 

    // Find the device ID from the devices table 
    models.Device.findOne({where: {device_uuid: body.device_uuid}, attributes: ['id']}).then(function(device) { 
     console.log("During"); 

     // Make sure that we got a device back 
     if (device === null) { 
      callback(new Error("Device not found - could not insert data")) 
     } 
     else { 
      console.log("Device found, inserting data - " + body.device_uuid); 

      //Insert the data for this device 
      models.Data.create({ 
       device_id: device.id,    
       data: body.data 
      }) 
      .then(function(insertedData){ 
       callback(null, insertedData.toJSON())  
      }) 
      .catch(function(error){ 
       callback(new Error("Error creating") 
      }) 
     } 
    })  
    console.log("After") 
} 
Смежные вопросы