【问题标题】:How to set um a Node.JS proxy on AWS Lambda如何在 AWS Lambda 上设置一个 Node.JS 代理
【发布时间】:2018-01-29 21:09:33
【问题描述】:

我试图将 Polyfill.io 服务器作为 AWS Lambda 上的微服务,它应该在 GET 请求上运行 JavaScript 文件。
当我在本地运行服务时,调用通过但它返回一个未定义的对象而不是 JS 文件。

我在本地使用serverless 运行它,我的代码基于polyfill.io's github repo

我已将 service/index.js 修改为:

'use strict';

const express = require('express');
const path = require('path');
const Raven = require('raven');
const morgan = require('morgan');
const shrinkRay = require('./shrink-ray');

const app = express().enable("strict routing");
const one_day = 60 * 60 * 24;
const one_week = one_day * 7;
const one_year = one_day * 365;

app.use(shrinkRay({
  brotli: {quality: 11}
}));

let ravenClient;

// Log requests
if (process.env.ENABLE_ACCESS_LOG) {
    app.use(morgan('method=:method path=":url" request_id=:req[X-Request-ID] status=:status service=:response-time bytes=:res[content-length]'));
}

process.on('uncaughtException', (err) => {
  console.log('Caught exception', err);
});

// Set up Sentry (getsentry.com) to collect JS errors.
if (process.env.SENTRY_DSN) {
    const about = require(path.join(__dirname, '../about.json'));
    ravenClient = new Raven.Client(process.env.SENTRY_DSN, {
        release: about.appVersion || process.env.SENTRY_RELEASE || 'unknown'
    });
    ravenClient.patchGlobal();
    app.use(Raven.middleware.express.requestHandler(ravenClient));
}

// Do not send the X-Powered-By header.
app.disable("x-powered-by");

// Default response headers
app.use((req, res, next) => {

    // Ensure our site is only served over TLS and reduce the chances of someone performing a MITM attack.
    res.set('Strict-Transport-Security', `max-age=${one_year}; includeSubdomains; preload`);

    // Enables the cross-site scripting filter built into most modern web browsers.
    res.set('X-XSS-Protection', `1; mode=block`);

    // Prevents MIME-sniffing a response away from the declared content type.
    res.set('X-Content-Type-Options', `nosniff`);


    // Sets content-type
    res.set('Content-Type', `application/javascript`);

    // Prevents clickjacking by prohibiting our site from being included on other domains in an iframe.
    res.set('X-Frame-Options', `sameorigin`);

    res.set('Cache-Control', 'public, s-maxage=' + one_year + ', max-age=' + one_week + ', stale-while-revalidate=' + one_week + ', stale-if-error=' + one_week);
    res.set('Surrogate-Key', process.env.SURROGATE_KEY || 'polyfill-service');
    res.set('Timing-Allow-Origin', '*');
    return next();
});


/* Routes */

app.use(require('./routes/api.js'));
app.use(require('./routes/meta.js'));
app.use('/test', require('./routes/test.js'));

if (process.env.RUM_MYSQL_DSN) {
    app.use(require('./routes/rum.js'));
}

app.use(/^\/v[12]\/assets/, express.static(__dirname + '/../docs/assets'));


if (process.env.SENTRY_DSN) {
    app.use(Raven.middleware.express.errorHandler(ravenClient));
}

module.exports.node = (event, context, callback) => {
    const response = {
      statusCode: 200,
      body: JSON.stringify({
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      }),
    };
    callback(event, app);
};

这是我的 serverless.yml:

service: serverless-node
provider:
  name: aws
  region: us-east-1
  stage: dev
  runtime: nodejs6.10

functions:
  node:
    handler: service/index.node
    events:
      - http:
        path: node
        method: get

【问题讨论】:

    标签: javascript node.js amazon-web-services lambda serverless-framework


    【解决方案1】:

    我认为您需要在处理程序的回调中传回响应对象,例如

    callback(null, response);
    

    【讨论】:

    • 那里的响应对象只是一个模型来测试代码是否被命中以及它是否能够返回任何东西,但在 polyfill 的官方代码中,app 负责返回一个JS.
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2019-02-03
    • 2021-07-17
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多