Ich möchte CouchDB als Datenbank-Backend in einer NodeJS-App mit Typescript verwenden. Hierfür wird CouchDb-Nano verwendet, da es die erforderlichen Typisierungen bereitstellt. Also habe ich beide Pakete installiert:
"devDependencies": {
"@types/nano": "^6.4.5"
},
"dependencies": {
"nano": "^6.4.3"
}
Ich habe diese Frage für die korrekte TS-Importsyntax gefunden. Es funktioniert nicht bei mir. Beim Herumspielen fand ich folgendes Kompilieren:
import Nano from "nano";
let nano = Nano("http://localhost:5984");
Aber meine Intelligenz im VS-Code scheint völlig anders zu sein. In den Dokumenten heißt es beispielsweise, dass Nano ein Attribut namens db
hat, das verschiedene Methoden wie diese zur Auswahl einer Datenbank enthält:
var alice = nano.db.use('alice');
Dieser Code gab mir einen Fehler, dass kein Attribut namens db
existiert. Intellisense zeigt mir nur auth, config, session
als Attribute:
VS Code Intellisense Screenshot
Laut dem Kommentar-Header ist der Typisierungen sind für couchdb-nano (kein anderes Projekt, das auch nano heißt) und auch für Version 6.4, die hier verwendet wird.
Also, was mache ich falsch?
3 Antworten
Sieht so aus, als ob Sie in der Lage sein sollten, die Nano-Funktion auf die ServerScope-Oberfläche zu übertragen, und dann sollte Intellisense bei der Interaktion mit Ihrem Nano-Objekt funktionieren.
import Nano, { ServerScope } from "nano";
const nano = Nano("http://localhost:5984") as ServerScope;
const alice = nano.db.use("alice");
Es wurde festgestellt, dass dieses Problem durch einen mehrdeutigen Rückgabewert in der Typdefinition verursacht wird:
declare function nano(
config: nano.Configuration | string
): nano.ServerScope | nano.DocumentScope<any>;
Die Funktion nano
kann nano.ServerScope
oder nano.DocumentScope<any>
als Rückgabewert haben. Durch Reverse Engineering habe ich gelernt, dass ServerScope
die richtige Klasse für mich ist. Es bietet Eigenschaften wie db
, die in der Dokumentation enthalten sind.
Also müssen wir hier explizit besetzen:
let nanoInstance = <Nano.ServerScope>Nano("http://localhost:5984");
Jetzt funktionieren alle Beispielcodes aus den Dokumenten wie folgt:
nanoInstance.db.create("test123");
Was ist der Unterschied?
Ich bin zu neu in nosql-Datenbanken, um den Unterschied genau zu erklären. Aber ich würde annehmen, dass wir durch die Bereitstellung eines URL-Parameters eine direkte Verbindung zu einem einzelnen Dokument anstelle der gesamten Datenbank herstellen können. Ich werde versuchen, diesen Beitrag zu bearbeiten, wenn ich mehr weiß. Im Moment ist dies für mich nicht primär relevant.
Ich verwende derzeit Nano mit Typoskript und Intellisense scheint gut zu funktionieren. Ich hatte es so eingerichtet.
import Nano from 'nano';
const instance: Nano.ServerScope = Nano('http://localhost:5984/');
const db: Nano.DocumentScope<{}> = instance.db.use('alice');
Für die Abhängigkeiten verwende ich:
"dependencies": {
"nano": "^7.0.0"
},
"devDependencies": {
"@types/nano": "^6.4.6"
}