簡體   English   中英

在等待數據庫查詢之前返回 AWS Lambda 響應 - 無服務器框架

[英]Returning AWS Lambda response before waiting for DB query - Serverless framework

我有一個無服務器框架 node.js function 初始化 mysql DB 然后運行查詢,ES6 用於最后返回 HTTP 響應

  1. 有沒有辦法在等待數據庫調用完成之前返回響應,例如在 node.js - res.send 將立即返回並且 function 在返回響應后繼續運行

  2. 有沒有更好的方法來初始化一個新的 mysql 池(也許重用池而不是在每個請求中創建一個結尾?)

    a: 例如,如果答案是在 function 之外創建池,它是如何工作的,lambda function 如何在請求之間重用它,它何時被銷毀以及它如何知道何時重新創建池

import mysql from "mysql";

export const myFunc = async (event) => {
  try {
    const pool = mysql.createPool({...}); // Creates a new mysql pool

    await new Promise((resolve, reject) => {pool.query(
      "INSERT STATEMENT", [...params], (error, results) => {
      if(error) reject(error)
      resolve(results)
}
    )});

    pool.end();

    return {
      statusCode: 200,
      body: JSON.stringify({message: 'End'}),
    };
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({message: 'Error'}),
    };
  }
};
  1. 有沒有辦法在等待數據庫調用完成之前返回響應

是的,但是 Lambda 將在等待數據庫調用完成之前完成執行。 不保證對DB的調用一定會到達DB,所以不建議這樣做

如果您絕對需要這個,請在這一行中刪除await語句:

從:

await new Promise((resolve, reject) => {pool.query(

到:

new Promise((resolve, reject) => {pool.query(
  1. 有沒有更好的方法來初始化一個新的 mysql 池(也許重用池而不是在每個請求中創建一個結尾?)

是的,您需要在 Lambda 處理程序之外初始化您的池。

查看這篇文章了解更多詳情:

https://dashbird.io/blog/leveraging-lambda-cache-for-serverless-cost-efficiency/

基本上,您想做的不是:

import mysql from "mysql";

export const myFunc = async (event) => {
  try {
    const pool = mysql.createPool({...}); // Creates a new mysql pool

做這個:

import mysql from "MySQL";

const pool = mysql.createPool({...}); // Creates a new mysql pool

export const myFunc = async (event) => {
  try {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM