我正在构建一个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'))
答案 0 :(得分:2)
因为你想要的是使用express
进行API网关的本地模拟,这就是我在项目中使用的内容。
这不需要serverless
或claudiajs
。
我也总是只使用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函数一样。
现在我可以在本地构建无服务器:)
我希望这有助于某人