简体   繁体   中英

How to set um a Node.JS proxy on AWS Lambda

I was trying to make a Polyfill.io server as a microservice on AWS Lambda, it was supposed to run a JavaScript file on a GET request.
When I run the service locally the call goes through but it returns an undefined object instead of JS file.

I'm running it locally using serverless , my code is based on polyfill.io's github repo

I've modified the service/index.js to be like so:

'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);
};

This is my 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

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

callback(null, response);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM