1. Einleitung
Koa ist ein Webentwicklungsframework der nächsten Generation, das auf der NodeJs-Plattform basiert und vom ursprünglichen Team hinter Express entwickelt wurde. Es ist bestrebt, ein kleineres, ausdrucksstärkeres und robusteres Webframework zu werden. Durch die Verwendung von Koa zum Schreiben von Webanwendungen können Sie durch die Kombination verschiedener Generatoren das wiederholte und langwierige Verschachteln von Rückruffunktionen vermeiden und die Effizienz der Fehlerbehandlung erheblich verbessern. Koa bindet keine Middleware in der Kernel-Methode, sondern bietet nur eine leichte und elegante Funktionsbibliothek, die das Schreiben von Webanwendungen erleichtert. Derzeit gibt es zwei Hauptversionen 1.x und 2.x. Die 2.x-Version verwendet die nach Node.js v7.6.0 unterstützte asynchrone Warten-Syntax-Zucker und bietet ein eleganteres asynchrones Programmiermodell.
2. Das Kernkonzept von Koa
Was genau macht Koa? Das Wichtigste und Kernstück in Koa ist die Realisierung der Verarbeitung des http-Protokolls. Es hat drei Hauptkernkonzepte:
- Koa-Anwendung: Hauptprogramm
- Kontext: Kontext
- Anfrage, Antwort: Anfrage und Antwort
Drei, grundlegende Verwendung
【1】 Vorbereitung
// 1.Koa必须使用7.6以上的node版本,检查node版本,低于要求的话就升级node
$ node -v
// 2.创建一个 my_koa 文件夹,生成package.json文件
$ npm init -y
// 3.安装koa依赖
$ npm install --save koa
[2] Code schreiben
Erstellen Sie eine index.js-Eintragsdatei im Ordner my_koa, und verwenden Sie dann koa, um einen http-Dienst einzurichten
// index.js文件
const Koa = require('Koa'); // 引入Koa
const app = new Koa(); // 创建Koa实例,定义Application
// 使用use方法来处理上下文
app.use(async ctx => {
// ctx是包含整个应用的上下文,可以对用户的请求做一些处理
ctx.body = 'hello, World!'
});
app.listen(3000); // 设置端口号,让Koa应用运行在3000端口上
Öffnen Sie nach dem Schreiben des obigen Codes in die Datei index.js das Terminal im Dateiverzeichnis und geben Sie den Knoten index.js ein, um die Datei auszuführen.
Öffnen Sie dann den Browser und geben Sie Folgendes ein: localhost: 3000, Sie können die von uns ausgegebenen Ergebnisse sehen
Viertens, Anwendung (Anwendung)
Eine Koa-Anwendung ist ein Objekt, das eine Reihe von Middleware-Funktionen enthält, die stapelartig organisiert und ausgeführt werden. Koa ähnelt vielen anderen Middleware-Systemen, auf die Sie möglicherweise gestoßen sind.
[1] app.listen () : Binden Sie einen Port-Server als Programmeintrag, und mehrere können gebunden werden. Das Folgende ist eine nutzlose Koa-Anwendung, die an den 3000
Port gebunden ist
const Koa = require('koa');
const app = new Koa();
app.listen(3000);
// app.listen(3000)是以下方法的语法糖
const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
[2] app.use (Funktion) : Fügen Sie dieser Anwendung die angegebene Middleware-Methode hinzu. App.use () gibt diese zurück, damit sie in einer Kette ausgedrückt werden kann
app.use(someMiddleware)
app.use(someOtherMiddleware)
app.listen(3000)
// 等同于
app.use(someMiddleware).use(someOtherMiddleware).listen(3000)
[3] app.keys =: Setzt den signierten Cookie-Schlüssel
app.keys = ['im a newer secret', 'i like turtle'];
app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');
[4] app.context: Der Prototyp, aus dem ctx erstellt wird. Sie können andere Attribute für ctx hinzufügen, indem Sie app.context bearbeiten
app.context.db = db();
app.use(async ctx => {
console.log(ctx.db);
});
[5] Fehlerbehandlung : Fügen Sie einen "Fehler" -Ereignis-Listener hinzu
app.on('error', (err, ctx) => {
log.error(err, ctx)
});
[6] next (): Die Funktion pausiert und übergibt die Steuerung an die nächste definierte Middleware
const Koa = require('Koa'); // 引入Koa
const app = new Koa(); // 创建Koa实例,定义Application
const one = (ctx, next) => {
console.log('进 one');
next();
console.log('出 one');
}
const two = (ctx, next) => {
console.log('进 two');
next();
console.log('出 two');
}
const three = (ctx, next) => {
console.log('进 three');
next();
console.log('出 three');
}
app.use(one);
app.use(two);
app.use(three)
app.listen(3000)
Fünftens Kontext (Kontext)
Koa stellt ein Kontextobjekt bereit, das den Kontext einer Konversation darstellt. Das Kontextobjekt kapselt das HTTP-Anforderungsobjekt (Anforderungsobjekt) und das HTTP-Antwortobjekt (Antwortobjekt) des Knotens in einem einzelnen Objekt. Durch Verarbeiten dieses Objekts können Sie den an den Benutzer zurückgegebenen Inhalt steuern.
[1] Kontextspezifische Methoden
- ctx.req: Anforderungsobjekt des Knotens
- ctx.res: Antwortobjekt des Knotens
- ctx.request: Koas Anforderungsobjekt
- ctx.response: Koas Antwortobjekt
- ctx.state: Empfohlener Namespace, mit dem Informationen und Ihre Front-End-Ansicht über Middleware übertragen werden
- ctx.app: Referenz der Anwendungsinstanz
- ctx.cookies.get (Name, [Optionen]): 获取 Cookie
- ctx.cookies.set (Name, Wert, [Optionen]): 设置 Cookie
- ctx.throw ([status], [msg], [properties]): eine Ausnahme auslösen
- ctx.assert (Wert, [Status], [Nachricht], [Eigenschaften]): löst einen Fehler aus
Sechs, Anfrage (Anfrage)
Das Koa- Anforderungsobjekt ist eine Abstraktion über dem nativen Anforderungsobjekt des Knotens und bietet viele Funktionen, die für die Entwicklung von HTTP-Servern nützlich sind.
- request.header: Anforderungsheaderobjekt, das gesetzt und zugewiesen werden kann (request.header = xxx)
- request.headers: Anforderungsheaderobjekt, Alias ist request.header, kann gesetzt und zugewiesen werden (request.headers = xxx)
- request.method: Anforderungsmethode, Sie können die Zuordnung festlegen (request.method = xxx)
- request.length: Gibt die angeforderte Inhaltslänge als Zahl oder undefiniert zurück
- request.url: Rufen Sie die Anforderungs-URL ab. Sie können die Anforderungs-URL festlegen, die für das Umschreiben von URLs nützlich ist (request.url = xxx).
- request.originalUrl: Ruft die ursprüngliche URL der Anfrage ab
- request.origin: Ruft die Quelle der URL ab, einschließlich Protokoll und Host
- request.href: Ruft die vollständige Anforderungs-URL ab, einschließlich Protokoll, Host und URL
- request.path: Ruft den Namen des Anforderungspfads ab. Sie können den Wert festlegen und die Abfragezeichenfolge beibehalten, wenn sie vorhanden ist (request.path = xxx).
- request.querystring: Gemäß? Um die ursprüngliche Abfragezeichenfolge abzurufen, können Sie die ursprüngliche Abfragezeichenfolge festlegen (request.querystring = xxx).
- request.search: Verwenden Sie?, um die ursprüngliche Abfragezeichenfolge abzurufen. Sie können die ursprüngliche Abfragezeichenfolge festlegen (request.search = xxx).
-
request.host: Ruft den Host ab, falls vorhanden
-
request.hostname: Ruft den Hostnamen ab, falls vorhanden
-
request.URL: Ruft das von WHATWG analysierte URL-Objekt ab
-
request.type: Ruft den Inhaltstyp der Anforderung ab, ausgenommen "Zeichensatz" und andere Parameter
-
request.charset: Ruft den angeforderten Zeichensatz ab, wenn er vorhanden oder undefiniert ist
-
request.query: Ruft die analysierte Abfragezeichenfolge ab. Wenn keine Abfragezeichenfolge vorhanden ist, geben Sie ein leeres Objekt zurück. Sie können die Zuweisung festlegen (request.query = xxx).
-
request.fresh: Überprüfen Sie, ob der Anforderungscache "frisch" ist, dh der Inhalt hat sich nicht geändert. Diese Methode wird zum Zwischenspeichern der Aushandlung zwischen If-None-Match / ETag und If-Modified-Since und Last-Modified verwendet. Es sollte nach dem Setzen eines oder mehrerer dieser Antwortheader in Anführungszeichen gesetzt werden
-
request.stale: das Gegenteil von request.fresh
-
request.protocol: Gibt das Anforderungsprotokoll "https" oder "http" zurück.
-
request.secure: Verwenden Sie ctx.protocol == "https", um zu überprüfen, ob die Anforderung über TLS gesendet wird
-
request.ip: Remote-Adresse anfordern
Sieben, Antwort (Antwort)
Das Koa Response-Objekt ist eine Abstraktion über dem nativen Antwortobjekt des Knotens und bietet viele Funktionen, die für die Entwicklung von HTTP-Servern nützlich sind.
- response.header: Antwortheaderobjekt
- response.headers: Antwortheaderobjekt, Alias ist response.header
- response.socket: Antwortsocket
- response.status: Ruft den Antwortstatus ab. Standardmäßig wird response.status auf 404 anstatt auf 200 als res.statusCode des Knotens festgelegt, und der Antwortstatus wird durch den numerischen Code festgelegt (response.status = xxx).
- response.message: Ruft die Antwortstatusnachricht ab. Standardmäßig ist response.message mit response.status verknüpft, und die Antwortstatusnachricht kann auf einen bestimmten Wert gesetzt werden (response.message = xxx).
- response.length: Gibt die Inhaltslänge der Antwort als Zahl zurück oder wird von ctx.body abgeleitet oder undefiniert. Sie können die Inhaltslänge der Antwort auf einen bestimmten Wert festlegen (response.length = xxx).
- response.body: Wenn Sie den Antworttext abrufen, können Sie den Antworttext auf Zeichenfolgenschreiben, Pufferschreiben, Stream-Pipeline, Objekt || Array-JSON-Zeichenfolge, Nullantwort ohne Inhalt festlegen
- response.type: Ruft den Inhaltstyp der Antwort ab, mit Ausnahme von "Zeichensatz" und anderen Parametern. Sie können den Inhaltstyp der Antwort über eine MIME-Zeichenfolge oder eine Dateierweiterung festlegen (response.type = xxx).
[1] Arten der HTTP-Antwort
Der Standardrückgabetyp von Koa ist text / plain (einfacher Text). Wenn Sie andere Arten von Inhalten zurückgeben möchten, können Sie mithilfe von ctx.request.accepts bestimmen, welche Daten der Client akzeptieren möchte (gemäß dem Feld Accept der HTTP-Anforderung) Verwenden Sie dann ctx.response.type, um den Rückgabetyp anzugeben.
const Koa = require('koa')
const app = new Koa()
const main = (ctx, next) => {
if (ctx.request.accepts('json')) {
ctx.response.type = 'json';
ctx.response.body = { data: 'Hello World' };
} else if (ctx.request.accepts('html')) {
ctx.response.type = 'html';
ctx.response.body = '<p>Hello World</p>';
} else if (ctx.request.accepts('xml')) {
ctx.response.type = 'xml';
ctx.response.body = '<data>Hello World</data>';
} else {
ctx.response.type = 'text';
ctx.response.body = 'Hello World';
};
}; //直接运行页面中会显示json格式,因为我们没有设置请求头,所以每一种格式都是ok的。
app.use(main) //app.use(function)用来加载中间件。
app.listen(3000)
8. Middleware
【1. Einleitung
Das größte Merkmal von Koa ist die einzigartige Middleware-Prozesssteuerung, das berühmte "Zwiebelmodell". Wir können deutlich sehen, dass eine Anfrage Schicht für Schicht von außen nach innen durch die Middleware und von innen zur Antwort geht, wenn Antworten. Gehen Sie Schicht für Schicht durch die Middleware. Genau wie beim Einsetzen eines Zahnstochers in eine Zwiebel durchläuft der Zahnstocher von außen nach innen Schichten der Zwiebelschale, um das "Zwiebelherz" zu erreichen. Wenn wir ihn herausziehen, passiert der Zahnstocher eine Schicht Zwiebelschale von der von innen nach außen.
【2】 Fall
Grundsätzlich werden alle Funktionen von Koa über Middleware implementiert. Jede Middleware akzeptiert standardmäßig zwei Parameter. Der erste Parameter ist das Context-Objekt und der zweite Parameter ist die nächste Funktion. Solange die nächste Funktion aufgerufen wird, kann das Ausführungsrecht auf die nächste Middleware übertragen werden. Wenn die nächste Funktion nicht in der Middleware aufgerufen wird, wird das Ausführungsrecht nicht weitergegeben. Die Funktionen Middleware1, Middleware2 und Middleware3 im folgenden Code werden als "Middleware" (Middleware) bezeichnet, da sie sich in der Mitte von HTTP-Anforderung und HTTP-Antwort befinden und zum Implementieren einiger Zwischenfunktionen verwendet werden. app.use () wird zum Laden von Middleware verwendet
const Koa = require('Koa');
const app = new Koa();
// 定义三个中间件的方法:middleware1、middleware2、middleware3,next()方法代表执行完当前中间件方法后,继续执行后面的方法
const middleware1 = function async(ctx, next) {
console.log('这是第一条middleware');
next();
console.log('这是第一条next之后的打印')
}
const middleware2 = function async(ctx, next) {
console.log('这是第二条middleware');
next();
console.log('这是第二条next之后的打印')
}
const middleware3 = function async(ctx, next) {
console.log('这是第三条middleware');
next();
console.log('这是第三条next之后的打印')
}
// 使用中间件方法
app.use(middleware1)
app.use(middleware2)
app.use(middleware3)
app.listen(5000)
[3] Middleware-Stack
Mehrere Middleware bilden einen mittleren Stapel, der in der Reihenfolge "first-in-last-out" ausgeführt wird.
app.use () wird nacheinander ausgeführt, wobei auf welche Middleware zuerst verwiesen wird und auf welche Methode Middleware zuerst ausgeführt wird
Bei der Begegnung mit next () übergibt Koa die aktuelle Middleware zur Verarbeitung an die nächste Middleware
Wenn next () in einer Methode nicht definiert ist, beendet Koa die Anforderung standardmäßig und gibt die Daten zurück
Wenn nach next () Code vorhanden ist, wartet Koa darauf, dass die gesamte Anwendung in der Reihenfolge app.use () aufgerufen wird, und führt dann den Code nach next () in umgekehrter Reihenfolge aus -letzte gerade erwähnt.
Neun, Koa-Router (Routing)
Websites haben im Allgemeinen mehrere Seiten. Wenn wir unterschiedliche APIs oder Pfade anfordern, müssen wir unterschiedliche Methoden ausführen und unterschiedliche Ergebnisse zurückgeben. Zu diesem Zeitpunkt müssen wir Koas Middleware-Koa-Router verwenden, um damit umzugehen.
[1] Anthropomorpher Koa-Router
npm install -S koa-router
【2】 Fall
const Koa = require('Koa');
const Router = require('koa-router'); // 引用koa-router
const app = new Koa();
const router = new Router();
// 定义get请求
// home是我们定义的访问路径:localhost:8000/home
router.get('/home', ctx => {
// 这个区域是中间件要去处理的上下文方法
ctx.body = '这是主页'
})
router.get('/detail', ctx => {
ctx.body = '这是详情页'
})
// app.use(router.routes()) 是把上面定义的路由里面的方法添加到Koa应用中
// allowedMethods方法可以把它看做一个拦截器,可以拦截一些我们应用没有定义的请求,然后返回相应的错误信息
app.use(router.routes()).use(router.allowedMethods())
app.listen(4000); // 设置端口号,让Koa应用运行4000端口上;
// 在浏览器访问 localhost:8000/home 输出了"这是主页"
// 在浏览器访问 localhost:8000/detail 输出了"这是详情页"
10. Referenzlink
http://www.ruanyifeng.com/blog/2017/08/koa.html
Die Artikel werden jede Woche kontinuierlich aktualisiert. Sie können auf WeChat nach " Front-End-Sammlung " suchen, um sie zum ersten Mal zu lesen. Antworten Sie auf [ Video ] [ Buch ], um 200G-Videomaterial und 30 PDF-Buchmaterial zu erhalten
.