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?

0
Daniel 18 Apr. 2018 im 17:50

3 Antworten

Beste Antwort

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");
1
Harry 18 Apr. 2018 im 15:11

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.

0
Daniel 18 Apr. 2018 im 15:12

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"
}
0
Adrian 24 Aug. 2018 im 09:46