2017-10-19 3 views
1

Ich versuche, Waffe in einem Express/Node-Projekt zu verwenden, jedoch möchte ich den Endpunkt als /db mounten. Ich hatte den folgenden Code funktionieren würde, hoffte aber halten ein immer Route.get() Callback-Funktionen Fehler erfordert:Wie benutze ich Gun als Express-Route?

var express = require('express'); 
var Gun = require('gun'); 

var app = express(); 
var port = 8080; 

var gun = new Gun({ 
    file: './data.json' 
}); 

// mount the gun db server 
app.get('/db', gun.router); 

// regular express route 
app.get('/', function(req, res) { 
    res.send('other stuff...'); 
}); 

// start the server 
app.listen(port, function() { 
    console.log('Web server listening on port ' + port); 
}); 

Irgendwelche Vorschläge?

Antwort

3

Doherty!

GUN kann mit Express verwendet werden, aber es ist kein Express-Route. zuerst mit Express montiert einem einfachen Pistole Server gehen Zum Beispiel lässt:

var express = require('express'); 
var Gun = require('gun'); 

var app = express(); 
app.use(Gun.serve).use(express.static(__dirname)); 

var server = app.listen(80); 
Gun({file: 'data.json', web: server}); 

(https://github.com/amark/gun/blob/master/examples/express.js)

GUN API ist jetzt im Browser verfügbar unter:

<script src="http://YOURSERVER.com/gun.js"></script> 
<script> 
    var gun = Gun('http://YOURSERVER.com/gun'); 
    gun.get('key').get('hello').put('world!'); 
    gun.get('key').get('hello').on(function(data){ console.log(data) }); 
</script> 

GUN ist nicht als Express-Route verfügbar. Zum Beispiel hat diese nicht:

http://YOURSERVER.com/data/key/hello?put=world! 

Warum?

GUN ist eine Echtzeit-Datenbank, wenn Sie einen REST oder CRUD Routen mit ausdrücklichem als API verwenden, dann Sie die Realtime-Fähigkeiten verlieren. Das bedeutet, dass Sie Ihre eigene benutzerdefinierte Long-Polling-Implementierung schreiben müssten, die den Punkt der Express-Route nicht erfüllt.

Ich verstehe, aber ich möchte immer noch eine REST oder CRUD API für GUN?

Es sollte nicht schwer sein, eine HTTP-Route zu erstellen, die Gun propagiert. Hier sind einige Pseudocode, die Ihnen den Einstieg erleichtern sollten. Wenn Sie es bauen, machen Sie es bitte zu einem Open-Source-Modul auf NPM, damit andere es genießen können !!!

// this is pseudocode!!! 
app.get('/data', (req, res) => { 
    path(req).val(data => res.send(data)) 
}); 

app.put('/data', (req, res) => { 
    path(req).put(req.param.put, ack => { 
    res.ack? 0 : res.ack = res.send(ack) 
    }) 
}); 

var path = (req) => { 
    var ref = gun; 
    req.path.split('/').forEach(key => ref = ref.get(key)); 
    return ref; 
} 

Lassen Sie uns wissen, wenn Sie es bauen! Wie immer, die Community chatroom is friendly und aktiv. Bitten Sie um Hilfe und stellen Sie hier Fragen. Danke, dass du dies zu einer SO-Frage gemacht hast!

+0

Mark, vielen Dank für die eingehende Antwort! Der Grund, warum ich Gun in eine Express-Route einpacken wollte, war, dass ich anfängliche Verbindungsanfragen mit Express-Middleware abfangen und nicht authentifizierte Benutzer mit einer 401 ablehnen konnte ... Natürlich werde ich Open Source, was auch immer ich zusammenbasteln werde :) –

+0

Ah, wenn Sie es sind Wollen Sie dies aus Gründen der Sicherheit/Autorisierung machen, dann ist das ein ganz anderes Thema. Sieh dir SEA (Security, Encryption, Authorization) für GUN an, einige Infos findest du hier: https://github.com/amark/gun/wiki/auth. Es ist in Alpha, und es gibt einige andere StackOverflow-Fragen, die ich noch nicht beantworten konnte - aber bitte fügen Sie mehr hinzu! – marknadal