L'idée de base est, vous créez une base de données de fonctions stockées sous forme de chaînes. Puisque JS vous permet de créer une fonction à partir d'une chaîne à l'aide du constructeur Function()
, vous pouvez générer dynamiquement une fonction à la demande. J'ai fourni un point de terminaison POST
pour enregistrer la fonction.
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);
});
permet de tester ceci:
$ node server.js
Express server listening on port 3000
De postier ou d'une autre fenêtre de terminal:
$ curl -X GET "http://localhost:3000/add/1/2/3"
{"result":"Function not present"}
permet maintenant enregistrer la fonction add
(qui est 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"}
La fonction enregistrée ici peut être beaucoup plus compliquée. N'oubliez pas que vous pouvez obtenir tous les arguments passés à la fonction en utilisant la variable Agruments.
Testez:
$ 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}
merci ... il est la « mise à jour automatique » partie que je ne vois pas comment ils mettent en œuvre ... – SoftTimur
Je vois ... Je l'ai vu des gens utiliser nodemon. Maintenant, ce que je veux savoir, c'est comment ils passent le contenu de la fonction mise à jour dans le navigateur dans 'router.get (...)' avant de déclencher la mise à jour automatique. – SoftTimur