如何创build一个运行的API端点?

我想知道如何使RunKit运行终点。

在RunKit的这个页面中,它会生成一个与代码关联的URL。 在浏览器中打开该URL将看到代码定义的response 。 而且,对代码的更改将会实时反映出来。

有谁知道他们如何实现这一目标?

我知道在一个平均网站上定义一个固定的api。 例如,由于以下代码,可以调用https://myexample.com/api/add/3/5 。 但是我不知道如何制作一个function可以实时更改的API。

 router.get('/api/add/:a/:b', function (req, res, next) { var r = Number(req.params.a) + Number(req.params.b); res.json(r) }) 

基本的想法是,你创build一个存储为string的函数的数据库。 由于JS允许你使用Function()构造函数从一个string中创build一个函数,所以你可以根据需要dynamic生成一个函数。 我提供了一个POST端点来注册该函数。

 var express = require("express"); var app = express(); var bodyParser = require('body-parser'); var router = express.Router(); var mongoose = require('mongoose'); db = mongoose.connect('mongodb://localhost:27017/login1'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); var data = new mongoose.Schema({ "name": String, "content": String }); model = mongoose.model("functions", data); router.post('/create', (req, res) => { // Insert validation for security and removing duplicates etc. model.insertMany({"name": req.body.name, "content": req.body.content}).then((d, err) => { res.status(200).send({'result': "Added"}); }); }); router.get('/:func/*', (req, res) => { var func = req.params.func; var args = req.params['0'].split('/'); model.findOne({"name": func}).then((d, err) => { if (err) {return res.status(404).send({'result': "Error with database"});} else if (d === null) {return res.status(202).send({'result': "Function not present"});} var func = Function(d.content); res.status(200).send({'result': func(...args)}); }); }); app.use("/", router); var port = process.env.PORT || 3000; var server = app.listen(port, function() { console.log('Express server listening on port ' + port); }); 

让我们testing一下:

 $ node server.js Express server listening on port 3000 

从邮递员或另一个terminal窗口:

 $ curl -X GET "http://localhost:3000/add/1/2/3" {"result":"Function not present"} 

现在让我们注册add函数(这是sum of arguments ):

 $ curl -X POST "http://localhost:3000/create/" -H "content-type:application/json" -d '{"name": "add", "content": "return [...arguments].reduce( (i, j) => i+=parseInt(j), 0);"}' {'result': "Added"} 

这里注册的函数可能要复杂得多。 请记住,您可以使用Agrumentsvariables获取传递给函数的所有参数。

testing它:

 $ curl -X GET "http://localhost:3000/add/1/2/3" {"result": 6} $ curl -X GET "http://localhost:3000/add/100/3/5/10/9/2" {"result": 129} 

Express中间件只是常规的JSfunction。

为了使路由具有不断变化的function,您不需要在运行时更改中间件function,只需要改变其行为。

我会尽力在这里展示一个可能的解决scheme。
请注意,这只是一个概念validation,而不是生产就绪和/或安全的解决scheme。


假设您的网站上有某种在线代码编辑器,它允许用户编写JS代码并将其保存到数据库中。

您可以像这样设置您的端点路由:

 router.get('/endpoint/:id', (req, res) => { // this id identifies a previously saved code wrote by a user let id = req.params.id // NOTE: THIS IS NOT ACTUAL WORKING JS CODE // fetch the previously saved code from your database as a string let code = database.getDocumentById(id) // you can construct an actual JS function form the string, using the `Function()` constructor let f = Function(code) // now you can call the function, do whatever you like with it and finally send the user the results let result = f() res.send(result) }) 

您可能需要为用户提供的代码创build一个包装函数,并控制将要执行的内容以及结果。


PS
另外看看这个关于从string创buildJS函数的post:
有没有一种方法来创build一个string与JavaScript的function?