Глобальные ресурсы в PureScript (для AWS Lambda) - PullRequest
0 голосов
/ 21 ноября 2018

Я хотел бы запустить код PureScript в AWS Lambda.Обычно, если лямбда-функция должна вызывать базу данных, соединение сохраняется в глобальной переменной.Извините, если следующий код JavaScript синтаксически неверен, так как я не пишу JavaScript, но мне нужно что-то вроде ниже (это код, ожидаемый AWS Lambda):

function createConnection() {
    connection = SomeDBLibrary.createConnection(username, pwd)
    return connection;
}
global.db_connection = createConnection();

handler = (event, context, callback) => {
    // TODO use global.db_connection here to call the database
};

module.exports {
 handler: handler
};

Как мне написатьэквивалентный PureScript, чтобы получить такой код?В настоящее время я вызываю функцию createConnection () в каждом из моих методов CRUD, что бесполезно.

Edit 1:

Ниже приведен мой фактический код PureScript.Функция, которую я хочу вызвать только один раз: aPool.Тем не менее, я считаю, что он вызывается каждый раз, когда кто-то достигает конечной точки /list.Я бы хотел, чтобы его ударили только один раз при первой загрузке обработчика.

module Main where

import Prelude hiding (apply)

import Data.Bifunctor (lmap)
import Data.Either (Either)
import Database.Postgres (Client, ClientConfig, ConnectionInfo, Pool, Query(Query), connectionInfoFromConfig, defaultPoolConfig, mkPool, query_, withClient)
import Effect (Effect)
import Effect.Aff (Aff)
import Effect.Aff.Class (liftAff)
import Effect.Class (class MonadEffect, liftEffect)
import Effect.Console (log)
import Effect.Exception (Error, error)
import Foreign (Foreign)
import Node.Express.App (App, get)
import Node.Express.Handler (Handler)
import Node.Express.Response (sendJson)
import Simple.JSON as JSON
import Network.AWS.Lambda.Express as Lambda


clientConfig :: ClientConfig
clientConfig =
  { host: "localhost"
  , database: "test"
  , port: 5432
  , user: "testuser"
  , password: "test"
  , ssl: false
  }

type IndexedTodo = { id :: Int, description :: String, isdone :: Boolean }

connectionInfo :: ConnectionInfo
connectionInfo = connectionInfoFromConfig clientConfig defaultPoolConfig

println :: forall a. MonadEffect a => String -> a Unit
println str =  liftEffect $ log str

aPool :: Effect Pool
aPool = do
  println "In Pooler"
  mkPool connectionInfo

withConnectionPool :: forall a. Effect Pool -> (Client -> Aff a) -> Aff a
withConnectionPool somePool f = do
  pool <- liftEffect somePool
  withClient pool \c -> f c

withConnection :: forall a. (Client -> Aff a) -> Aff a
withConnection = withConnectionPool aPool

read' :: forall a. JSON.ReadForeign a => Foreign -> Either Error a
read' = lmap (error <<< show) <<< JSON.read

readTodoList :: Aff (Array IndexedTodo)
readTodoList = do
  let selectQuery = Query "select * from todos" :: Query IndexedTodo
  withConnection $ query_ read' selectQuery

listTodosHandler :: Handler
listTodosHandler = do
  userdata <- liftAff readTodoList
  sendJson userdata


app :: App
app = do
  get "/list"       listTodosHandler

-- Define the AWS Lambda handler
handler :: Lambda.HttpHandler
handler = Lambda.makeHandler app

1 Ответ

0 голосов
/ 23 ноября 2018

Я думаю, что для этого требуется FFI вроде:

foreign import dbConnection :: Effect Connection

с реализацией:

exports.dbConnection = function() {
  if(globals.dbConnection === undefined) {
    globals.dbConnection = createConnection();
  }
  return globals.dbConnection;
}
...