簡體   English   中英

沒有 Express 的節點中間件

[英]Node Middleware Without Express

我正在構建一個 AWS Lambda 服務器以與 API 網關集成,但我無法公開該服務器以便我可以將其掛接到 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'))

由於您想要的是使用express對 API Gateway 進行本地模擬,因此這是我用於我的項目的內容。

這並不需要serverlessclaudiajs

我也總是只使用 Lambda 代理集成,所以它更簡單。

像這樣的東西...

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文件並根據需要重新加載。

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

Node http沒有中間件的概念。 您要么需要創建自己的中間件鏈,要么使用諸如express東西。 如果出於某種原因,您不想使用express (從您的問題中不清楚為什么會這樣),您始終可以選擇使用connect ,它是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);

我找到了一種使用無服務器框架和無服務器離線插件並遵循本教程來模擬本地 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 文件中來獲得可以命中的端點。

這些函數像 Lambda 函數一樣接收(event, context, callback)函數。

現在我可以在本地為無服務器構建:)

我希望這有助於某人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM