Pocket からすべての「ニュースレター」投稿を取得する Lambda の例。
./src/lambda/newsletter.js のラムダ コードを参照してください。
https://pocket-newsletter-lambda.netlify.com/ で実行します。
目次:
Pocket 固有のロジックの大部分はfetchBookmarks
関数であり、次のことを行います。
state: 'all'
を渡します。tag: 'newsletter'
を使用して、 newsletter
でタグ付けされた投稿を取得しますdetailType: 'complete'
、API がより完全なデータを返すことを意味します{ title, url, excerpts, authors }
のフラット リストに変換します (これらのフィールドはすべて文字列です)コードを参照してください
async function fetchBookmarks ( consumerKey , accessToken ) {
const res = await axios . post ( 'https://getpocket.com/v3/get' , {
consumer_key : consumerKey ,
access_token : accessToken ,
tag : 'newsletter' ,
state : 'all' ,
detailType : 'complete'
} ) ;
const { list } = res . data ;
// List is a key-value timestamp->entry map
const entries = Object . values ( list ) ;
return entries . map (
( {
given_title ,
given_url ,
resolved_url ,
resolved_title ,
excerpt ,
authors ,
rest
} ) => ( {
... rest ,
title : given_title || resolved_title ,
url : given_url || resolved_url ,
excerpt ,
authors : authors
? Object . values ( authors )
. map ( ( { name } ) => name )
. filter ( Boolean )
. join ( ',' )
: ''
} )
) ;
}
ラムダは本体を含む POST のみをサポートするため、次のようになります。
if ( event . httpMethod !== 'POST' ) {
return {
statusCode : 404 ,
body : 'Not Found'
} ;
}
if ( ! event . body ) {
return {
statusCode : 400 ,
body : 'Bad Request'
} ;
}
URL エンコードされたフォーム POST リクエスト (デモ ページで JS が無効になっている場合などに実行) と JSON リクエストの両方をサポートしています。
本文は、base64 でエンコードされたか (URL エンコードされたフォーム本文リクエストを使用する場合)、そうでないかのいずれかで到着します。これは、 event
のisBase64Encoded
フラグによって示されます。
Node での Base64 エンコードされた文字列の解析はBuffer.from(event.body, 'base64').toString('utf-8)
を使用して行われます。
本文を URL エンコードされた形式からオブジェクトに変換するには、次の関数が使用されます。これは、単純なフィールドを含む POST で機能します。
function parseUrlEncoded ( urlEncodedString ) {
const keyValuePairs = urlEncodedString . split ( '&' ) ;
return keyValuePairs . reduce ( ( acc , kvPairString ) => {
const [ k , v ] = kvPairString . split ( '=' ) ;
acc [ k ] = v ;
return acc ;
} , { } ) ;
}
ラムダの機能は次のとおりです。
const {
pocket_consumer_key : pocketConsumerKey ,
pocket_access_token : pocketAccessToken
} = event . isBase64Encoded
? parseUrlEncoded ( Buffer . from ( event . body , 'base64' ) . toString ( 'utf-8' ) )
: JSON . parse ( event . body ) ;
コンシューマ キーまたはアクセス トークンが見つからない場合は、400 が送信されます。
if ( ! pocketConsumerKey || ! pocketAccessToken ) {
return {
statusCode : 400 ,
body : 'Bad Request'
} ;
}
最後に、 fetchBookmarks
うとします (この関数の機能は上で詳しく説明されています)。
それがリクエスト エラーで失敗した場合 (axios が失敗した場合、エラーに関するresponse
プロパティがあります)、その応答の情報をクライアントに送り返す必要があります。それ以外の場合は、エラーの場合は 500、成功の場合は 200 です。
try {
const bookmarks = await fetchBookmarks ( pocketConsumerKey , pocketAccessToken ) ;
return {
statusCode : 200 ,
body : JSON . stringify ( bookmarks )
} ;
} catch ( e ) {
if ( e . response ) {
return {
statusCode : e . response . statusCode ,
body : `Error while connecting to Pocket API: ${ e . response . statusText } `
}
}
return {
statusCode : 500 ,
body : e . message
}
}
[
{
"title" : "TechnicalDebt" ,
"url" : "https://martinfowler.com/bliki/TechnicalDebt.html" ,
"excerpt" : "Software systems are prone to the build up of cruft - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further." ,
"authors" : ""
} ,
{
"title" : "CannotMeasureProductivity" ,
"url" : "https://martinfowler.com/bliki/CannotMeasureProductivity.html" ,
"excerpt" : "We see so much emotional discussion about software process, design practices and the like. Many of these arguments are impossible to resolve because the software industry lacks the ability to measure some of the basic elements of the effectiveness of software development." ,
"authors" : ""
} ,
{
"title" : "How SQLite Is Tested" ,
"url" : "https://www.sqlite.org/testing.html" ,
"excerpt" : "The reliability and robustness of SQLite is achieved in part by thorough and careful testing. As of version 3.23.0 (2018-04-02), the SQLite library consists of approximately 128.9 KSLOC of C code." ,
"authors" : ""
} ,
{
"title" : "How FriendFeed uses MySQL to store schema-less data" ,
"url" : "https://backchannel.org/blog/friendfeed-schemaless-mysql" ,
"excerpt" : "We use MySQL for storing all of the data in FriendFeed. Our database has grown a lot as our user base has grown. We now store over 250 million entries and a bunch of other data, from comments and "likes" to friend lists." ,
"authors" : ""
} ,
{
"title" : "jlevy/the-art-of-command-line: Master the command line, in one page" ,
"url" : "https://github.com/jlevy/the-art-of-command-line" ,
"excerpt" : "Note: I'm looking for a new (and potentially paid) lead author to help expand this to a more comprehensive Guide. While it's very popoular, it could be both deeper and more helpful." ,
"authors" : ""
} ,
{
"title" : "Project Mezzanine: The Great Migration | Uber Engineering Blog" ,
"url" : "https://eng.uber.com/mezzanine-migration/" ,
"excerpt" : "What happens when you have to migrate hundreds of millions of rows of data and more than 100 services over several weeks while simultaneously keeping Uber running for millions of riders? This is the story of how dozens of engineers helped Uber move to Mezzanine in 2014." ,
"authors" : "Rene Schmidt"
} ,
{
"title" : "8 Protips to Start Killing It When Dockerizing Node.js - NodeSource" ,
"url" : "https://nodesource.com/blog/8-protips-to-start-killing-it-when-dockerizing-node-js/" ,
"excerpt" : "Containers are the best way to deploy Node.js applications to production. Containers provide a wide variety of benefits, from having the same environment in production and development to streamlining deploys for speed and size. Dockerizing your Node." ,
"authors" : "Tierney Cyren"
} ,
{
"title" : "How and Why We Switched from Erlang to Python – Mixpanel Engineering" ,
"url" : "https://engineering.mixpanel.com/2011/08/05/how-and-why-we-switched-from-erlang-to-python/" ,
"excerpt" : "A core component of Mixpanel is the server that sits at http://api.mixpanel.com. This server is the entry point for all data that comes into the system – it’s hit every time an event is sent from a browser, phone, or backend server." ,
"authors" : "mxpnl"
} ,
{
"title" : "Some Were Meant for C - kell17some-preprint.pdf" ,
"url" : "https://www.cs.kent.ac.uk/people/staff/srk21//research/papers/kell17some-preprint.pdf" ,
"excerpt" : "" ,
"authors" : ""
} ,
{
"title" : "API Gateways Are Going Through an Identity Crisis" ,
"url" : "http://blog.christianposta.com/microservices/api-gateways-are-going-through-an-identity-crisis/" ,
"excerpt" : "API Gateways are going through a bit of an identity crisis these days. Are they centralized, shared resources that facilitate the exposure and governance of APIs to external entities?" ,
"authors" : ""
} ,
{
"title" : "Understanding Database Sharding" ,
"url" : "https://www.digitalocean.com/community/tutorials/understanding-database-sharding" ,
"excerpt" : "Any application or website that sees significant growth will eventually need to scale in order to accommodate increases in traffic. For data-driven applications and websites, it's critical that scaling is done in a way that ensures the security and integrity of their data." ,
"authors" : "Justin Ellingwood"
} ,
{
"title" : "Moving from Ruby to Rust" ,
"url" : "http://deliveroo.engineering/2019/02/14/moving-from-ruby-to-rust.html" ,
"excerpt" : "In the Logistics Algorithms team, we have a service, called Dispatcher, the main purpose of which is to offer an order to the rider, optimally." ,
"authors" : "Andrii Dmytrenko"
} ,
{
"title" : "Getting to Know Python 3.7: Data Classes, async/await and More! | Heroku" ,
"url" : "https://blog.heroku.com/python37-dataclasses-async-await" ,
"excerpt" : "If you're like me, or like many other Python developers, you've probably lived (and maybe migrated) through a few version releases. Python 3.7(." ,
"authors" : "Casey Faist"
} ,
{
"title" : "? What does Unsplash cost in 2019?" ,
"url" : "https://medium.com/p/f499620a14d0" ,
"excerpt" : "Since then, Unsplash has continued to grow tremendously, now powering more image use than the major image media incumbents, Shutterstock, Getty, and Adobe, combined." ,
"authors" : "Luke Chesser"
} ,
{
"title" : "PHP in 2019 - stitcher.io" ,
"url" : "https://stitcher.io/blog/php-in-2019" ,
"excerpt" : "Do you remember the popular "PHP: a fractal of bad design" blog post? The first time I read it, I was working in a crappy place with lots of legacy PHP projects. This article got me wondering whether I should just quit and go do something entirely different than programming." ,
"authors" : ""
}
]
私のサイトでは、ラムダはリクエストからアクセス トークンとコンシューマー キーを読み取りません。
代わりに、環境変数からトークンとキーを読み取る単純な GET です。
始める前にyarn
を実行する必要があります。
次のスクリプトが利用可能です。
yarn start
: Lambda を開始し、 Netlify Dev を使用して静的ディレクトリを提供します。重要: yarn build:tw
start
の前に実行されます。yarn build:tw
: Tailwind CSS ユーティリティの完全なセットをビルドします (開発に役立ちます)。yarn yarn build:css
使用して、サイトがライブでどのように見えるかを必ず確認してください。yarn build
: netlify-lambda ビルド + Tailwind CSS 本番ビルドを実行します (PurgeCSS を使用して未使用のクラスを削除します)yarn build:css
: Tailwind CSS 本番ビルド (PurgeCSS を使用して未使用のクラスを削除)yarn lint
とyarn format
: --fix
フラグを指定して、または指定せずに、「優れたデフォルトを備えた JavaScript リンター」(github.com/xojs/xo を参照) である XO を実行します。