Serverless Devs介绍和使用示例

91 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Serverless Devs

Serverless Devs是一个开源开放的Serverless开发者平台,您无需关心底层资源。通过Serverless Devs,您不仅可以可插拔式地使用Serverless的服务和框架,也可以参与组件和插件的开发,提高运维效率。同时,您也可以更简单、快速地开发、创建、测试和部署项目,实现项目全生命周期的管理。

# 安装
npm install @serverless-devs/s -g

# 验证是否安装成功
s -v

# 初始化项目(YAML模式)
s init node.js12-http -d fc-hello-world-demo

# 初始化项目(非YAML模式)
s init node.js12-http -d fc-hello-world-demo

# 构建、本地调试(HTTP/事件)、远程调试、部署
s build
s local start/s local invoke
s invoke
s deploy

# 删除应用
s remove service

# 初始化puppeteer-nodejs项目
s init puppeteer-nodejs

示例

1. 在线IDEA,发送HTTP请求(serverless)

index.js

var getRawBody = require('raw-body');
var getFormBody = require('body/form');
var body = require('body');
const http = require('http');

exports.handler = (req, resp, context) => {
    console.log('hello world');
    getRawBody(req, function(err, body) {
        (async () => {
            const httpGet = (from,to,date) => {
                return new Promise((resolve, reject) => {
                    var options = {
                        hostname: 'api.ipify.org',
                        port: 80,
                        path: '/',
                        method: 'GET'
                    };
                    http.request(options, res => {
                    res.setEncoding('utf8');
                    let body = ''; 
                    res.on('data', chunk => body += chunk);
                    res.on('end', () => {
                        resolve(body)
                    });
                    }).on('error', reject).end();
                });
            };
            resp.send(await httpGet());
        })()
    });
};

2. 基于 puppeteer 的截图(ServerlessDevs)

github.com/devsapp/sta…

index.js

const fs = require('fs');
const puppeteer = require('puppeteer');

module.exports.handler = function (request, response, context) {

  (async () => {
    const browser = await puppeteer.launch({
      headless: true,
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
      ]
    });

    let url = request.queries['url'];

    if (!url) {
      url = 'https://www.baidu.com';
    }

    if (!url.startsWith('https://') && !url.startsWith('http://')) {
      url = 'http://' + url;
    }

    const page = await browser.newPage();

    await page.emulateTimezone('Asia/Shanghai');
    await page.goto(url, {
      'waitUntil': 'networkidle2'
    });

    let path = '/tmp/example';
    let contentType;

    if (request.queries['pdf']) {
      contentType = 'application/pdf';
      await page.pdf({
        path: path,
        displayHeaderFooter: false
      });
    } else {
      contentType = 'image/png';
      await page.screenshot({ path: path, fullPage: true, type: 'png' });
    }

    await browser.close();

    response.setStatusCode(200);
    response.setHeader('content-type', contentType);
    response.send(fs.readFileSync(path))
  })().catch(err => {
    response.setStatusCode(500);
    response.setHeader('content-type', 'text/plain');

    response.send(err.message);
  });
};

3. 基于 puppeteer 的截图(代理)

html2png.js

const puppeteer = require('puppeteer')
try {
  (async () => {
    const proxyUrl = 'http://host:12323'
    const browser = await puppeteer.launch({
      headless: true,
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        `--proxy-server=${proxyUrl}`
      ]
    })
    const url = 'https://whatismyipaddress.com'
    const page = await browser.newPage()
    await page.authenticate({
      username: 'username',
      password: 'password'
    })
    await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')
    await page.emulateTimezone('Asia/Shanghai')
    await page.goto(url, {
      waitUntil: 'networkidle2', timeout: 120000
    })
    await page.screenshot({ path: 'html2png.png', fullPage: true, type: 'png' })
    await browser.close()
  })()
} catch (err) {
  console.error(err)
}

参考

serverless-devs www.serverless-devs.com

Serverless Devs github.com/Serverless-…

Serverless Devs Registry github.com/devsapp

Serverless入门与实战 ucc-private-download.oss-cn-beijing.aliyuncs.com/193e4522c18…

Puppeteer项目在阿里云函数计算的实践 github.com/devsapp/sta…

Puppeteer examples github.com/checkly/pup…