async interactor
Interactor pattern for node.js/browser using async/await
Getting Started
$ npm install --save async-interactor
NOTE: async/await support required from node 7.6.0+ or something like async-to-gen
Usage
import Interactor from 'async-interactor'
class AuthenticateUser extends Interactor {
async call () {
const {username, password} = this.context
const user = await db.where({username, password}).find()
if (!user) {
this.fail('User not found')
}
this.context.user = user
}
}
app.post('/login', async (req, res) => {
const result = await AuthenticateUser.call(req.params)
if (result.success) {
res.send({success: true, user: result.user})
}
})
Organizers
import Interactor from 'async-interactor'
class AddSubscription extends Interactor {
organize () {
return [AuthenticateUser, FinalizePayment]
}
}
app.post('/buy', async (req, res) => {
const result = await AddSubscription.call(req.params)
})
Errors
By default any errors thrown inside of an interactor are swallowed and return in the result of the interactor. This allows you to check the result of the interactor after it runs, regardless of a success or failure. There is a throwOnError
option available if you don't want this default behavior.
class ThisWillThrow extends Interactor {
throwOnError = true
async call () {
throw new Error('Boom')
}
}
const result = await ThisWillThrow.call({})
console.log(result)