没有Express的节点中间件

时间:2018-01-16 19:57:52

标签: node.js aws-lambda aws-api-gateway

我正在构建一个AWS Lambda Server以与API Gateway集成,我无法公开服务器,因此我可以将其挂钩到Express。我想知道是否有人知道在没有Express的情况下使用中间件的最佳做法。

这是我的代码。

    var jobs = require('./jobs');
    var http = require('http')

    const server = http.createServer()

    server.on('request', (req, res) => {


    //I want to be able to add a function here that executes all of the middleware that I specify.

    const { headers, method, url } = req;

    let body = [];

    if(url)

            enableCors(res);
            res.writeHead(200, {'Content-Type': 'application/json'})

            const resBody = { headers, method, url, body };

            res.write(JSON.stringify(resBody));
            res.end();
    }).listen(8080);

我希望有一些类似于Express的东西,我可以写这样的东西,服务器会知道在我的路线上搜索该目录。

server.use('/api', require('./api'))

3 个答案:

答案 0 :(得分:2)

因为你想要的是使用express进行API网关的本地模拟,这就是我在项目中使用的内容。

这不需要serverlessclaudiajs

我也总是只使用Lambda Proxy集成,因此它更简单。

像这样......

const bodyParser = require('body-parser')
const cors = require('cors')
const express = require('express')

// Two different Lambda handlers
const { api } = require('../src/api')
const { login } = ('../src/login')

const app = express()

app.use(bodyParser.json())
app.use(cors())

// route and their handlers
app.post('/login', lambdaProxyWrapper(login))
app.all('/*', lambdaProxyWrapper(api))

app.listen(8200, () => console.info('Server running on port 8200...'))


function lambdaProxyWrapper(handler) {
  return (req, res) => {
    // Here we convert the request into a Lambda event
    const event = {
      httpMethod: req.method,
      queryStringParameters: req.query,
      pathParameters: {
        proxy: req.params[0],
      },
      body: JSON.stringify(req.body),
    }

    return handler(event, null, (err, response) => {
      res.status(response.statusCode)
      res.set(response.headers)

      return res.json(JSON.parse(response.body))
    })
  }
}

然后,使用nodemon运行它,以便它监视文件并根据需要重新加载。

nodemon --watch '{src,scripts}/**/*.js' scripts/server.js

答案 1 :(得分:0)

节点http没有中间件的概念。您需要创建自己的中间件链,或者使用express之类的东西。如果出于某种原因,您不想使用express(不清楚您的问题为何会出现这种情况),您可以随时选择使用express var connect = require('connect'); var http = require('http'); var app = connect(); // gzip/deflate outgoing responses var compression = require('compression'); app.use(compression()); // store session state in browser cookie var cookieSession = require('cookie-session'); app.use(cookieSession({ keys: ['secret1', 'secret2'] })); // parse urlencoded request bodies into req.body var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({extended: false})); // respond to all requests app.use((req, res) => { const { headers, method, url } = req; let body = []; if(url) enableCors(res); res.writeHead(200, {'Content-Type': 'application/json'}) const resBody = { headers, method, url, body }; res.write(JSON.stringify(resBody)); res.end(); }); //create node.js http server and listen on port http.createServer(app).listen(8080); 上。

<a href="javascript:;" onclick="load_page(this,'predictions')">

答案 2 :(得分:0)

我找到了一种方法,使用serverless框架和serverless-offline插件以及this tutorial来模拟本地Lambda和API网关。

这构建了一个dockerized容器,允许我使用以下格式的serverless.yml文件在本地创建我的端点。

functions:
  getDataFromBackend:
    handler: handler.handlerFunc
    events:
      - http:
          path: /api/path/to/endpoint/{param}
          method: get
          cors: true

然后我运行这个命令后......

sls offline start -r us-east-1 --noTimeout

通过将各自的函数添加到handler.js文件,我得到了可以点击的端点。

这些函数接收(event, context, callback)函数,就像Lambda函数一样。

现在我可以在本地构建无服务器:)

我希望这有助于某人