前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我用nodejs实现了热加载接口文件,感觉又离“serverless”进了一步

我用nodejs实现了热加载接口文件,感觉又离“serverless”进了一步

作者头像
爱吃大橘
发布2022-12-27 14:40:21
3860
发布2022-12-27 14:40:21
举报
文章被收录于专栏:前端笔记薄前端笔记薄

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

背景

serverless很火,但是很多文章概念多实践少,也不适合个人开发者来玩耍。固然和硬件设备绑定,有完善生态的severless才有大的商业价值。但是个人想要试一下serverless总没有问题吧,结果看了一堆文章实现复杂,难以快速搭建落地。所以我准备自己搞一个serverless版本。

目标

  • 云函数可以快速部署。
  • 一个服务可以多个云函数。
  • 接口式访问。

设计思路

一个云函数形成一个nodejs文件,服务端动态加载这些nodejs,访问文件对应的接口,就返回该云函数的运行结果。

工具库 与 实现

框架选择 koa

新建一个名字叫serverless的文件夹,然后进入文件夹后执行以下

代码语言:javascript
复制
npm init -y
npm i koa

库介绍

koa 与 koa-body

koa 是一个简单nodejs服务端框架,封装了nodejs的一些基础api,可以让你上手更快

koa-body 是一个基于koa,用于处理用户传入信息(Class: http.IncomingMessage)的库。IncomingMessage 又继承了 stream。而在koa中req是基于incomingMessage的再次封装。而一般业务逻辑中,我们不需要对流进行特别的处理,建议强烈建议使用 koa-body,来避免自己直接处理 IncomingMessage。

代码语言:javascript
复制
const Koa = require('koa');
const app = new Koa();
const koaBody = require('koa-body');
app.use(koaBody())

function test(ctx) {
    console.log(ctx.request.body);
    // => POST body
    ctx.body = JSON.stringify(ctx.request.body);
}

app.use(test);

app.listen(3000);

glob 支持以某种规则读取目录下指定的文件

代码语言:javascript
复制
var glob = require("glob")

// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

koa-router koa 的路由器中间件

实现热加载

目录结构
代码语言:javascript
复制
serverless
  ├─app.js
  ├─middleware
  │    ├─get
  │    │    └─test.js
  │    └─post
  ├─package-lock.json
  └─package.json
代码语言:javascript
复制
var Koa = require('koa');
var Router = require('koa-router');

var app = new Koa();
var router = new Router();

router.get('/', (ctx, next) => {
  // ctx.router available
});

app
  .use(router.routes())
  .use(router.allowedMethods());
代码语言:javascript
复制
const path = require('path');
const Koa = require('koa');
const route = require("koa-route");
const koaBody = require("koa-body");
const glob = require('glob');
const app = new Koa();

app.use(
    koaBody({
        jsonLimit: '50mb',
    })
);

// ----------------



setPostApi()

// 定时加载 接口文件
setInterval(() => {
    console.log('first')
    setPostApi()

}, 10000);
function json(ctx) {
    return function (jn) {
        ctx.body = JSON.stringify(jn)
    }
}

function addJsonApi(fn) {

    return async function (ctx) {
        const { request, res } = ctx
        request.cookies = {
            'principal_dev': ctx.cookies.get('principal_dev')
        }
        res.json = json(ctx)
        await fn(request, res)
    }
}
function setPostApi() {


    let fileList = glob.sync(path.join(__dirname, './middleware/post/*.js'));
    fileList.map((file) => {
        const { reg, fn } = require(file)
        app.use(route.post(reg, addJsonApi(fn)));
    });
    fileList = glob.sync(path.join(__dirname, './middleware/get/*.js'));
    fileList.map((file) => {
        const { reg, fn } = require(file)
        app.use(route.get(reg, addJsonApi(fn)));
    });
}


app.listen(3000);

test.js 文件 内容

代码语言:javascript
复制
function aaaaa(req,res) {
    res.json('ccccccc')
}

module.exports = {
    reg: /test*/,
    fn:aaaaa
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 目标
  • 设计思路
  • 工具库 与 实现
    • 库介绍
      • koa 与 koa-body
    • 实现热加载
      • 目录结构
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档