Başlarken
Connect-Node, Connect, gRPC ve gRPC-Web uyumlu HTTP API'leri sunan bir Node.js kütüphanesidir. Node'a Connect Protokolü'nü getirir, tam TypeScript uyumluluğu ile birlikte dört tür uzak prosedür çağrısını destekler: unary ve üç çeşit akış.
Bu on dakikalık geçiş, Node.js'de küçük bir Connect servisi oluşturmanıza yardımcı olur.
Ne yazacağınızı, Connect'in sizin için neler ürettiğini ve yeni API'nizi nasıl çağıracağınızı gösterir.
Ön koşullar
Sıfırdan bir proje oluşturacağız ve ardından yeni bir uç nokta sunmak için bunu artıracağız.
- Node.js kurulu olmalıdır - en son uzun vadeli destek sürümünü (LTS) öneriyoruz.
- Paket yöneticisi olarak
npm
kullanacağız, ancakyarn
vepnpm
ile de uyumluyuz. - Ayrıca cURL kullanacağız. Homebrew ve çoğu Linux paket yöneticisinden temin edilebilir.
Proje kurulumu
TypeScript ile bir projeyi başlatalım ve bazı kod üretim araçlarını kuralım:
$ mkdir connect-example
$ cd connect-example
$ npm init -y
$ npm install typescript tsx
$ npx tsc --init
$ npm install @bufbuild/buf @bufbuild/protobuf @bufbuild/protoc-gen-es @connectrpc/connect
Bir hizmet tanımlama
Öncelikle, hizmet tanımımızı içeren bir Protobuf dosyası eklememiz gerekiyor. Bu öğretici için, ünlü doğal dil işleme programı ELIZA'nın sade bir uygulaması için bir unary uç noktası oluşturacağız.
$ mkdir -p proto && touch proto/eliza.proto
Yukarıdaki dosyayı açın ve aşağıdaki hizmet tanımını ekleyin:
syntax = "proto3";
package connectrpc.eliza.v1;
message SayRequest {
string sentence = 1;
}
message SayResponse {
string sentence = 1;
}
service ElizaService {
rpc Say(SayRequest) returns (SayResponse) {}
}
Kod üretme
Kodumuzu Buf kullanarak üreteceğiz, bu Google'ın protobuf derleyicisinin modern bir alternatifi. Buf'u daha önce kurduk, ancak işe başlamak için bir yapılandırma dosyasına da ihtiyacımız var. (İsterseniz, bu bölümü atlayabilir ve protoc
kullanabilirsiniz — protoc-gen-es
diğer eklentiler gibi çalışır.)
Öncelikle, depo kökünüze basit bir [buf.yaml
][buf.yaml] dosyası oluşturun:
$ npx buf config init
Ardından, buf.yaml
dosyasını proto
dizinimizi kullanacak şekilde düzenleyin:
version: v2
modules:
- path: proto
lint:
use:
- DEFAULT
breaking:
use:
- FILE
Sonraki adımda, kodun nasıl üretileceğini Buf'a belirtmek için bunu [buf.gen.yaml
][buf.gen.yaml] dosyasına yerleştirin:
version: v2
plugins:
- local: protoc-gen-es
out: gen
opt: target=ts
Bu yapılandırma dosyaları yerinde olduğunda, şemanızı denetleyebilir ve kod üretebilirsiniz:
$ npx buf lint
$ npx buf generate
Artık oluşturulmuş bir TypeScript dosyası görmelisiniz:
.
├── buf.gen.yaml
├── buf.yaml
├── gen
│ └── eliza_pb.ts
├── node_modules
├── package-lock.json
├── package.json
├── proto
│ └── eliza.proto
└── tsconfig.json
Sonraki aşamada, bu dosyaları kullanarak hizmetimizi uygulayacağız.
Hizmeti uygulama
ElizaService
'i tanımladık - şimdi onu uygulama zamanı ve ConnectRouter
ile kaydetme zamanı. Öncelikle, uygulama için bir dosya oluşturalım:
Yeni bir connect.ts
dosyası oluşturun ve aşağıdaki içeriği ekleyin:
import type { ConnectRouter } from "@connectrpc/connect";
import { ElizaService } from "./gen/eliza_pb";
export default (router: ConnectRouter) =>
// connectrpc.eliza.v1.ElizaService'i kaydeder
router.service(ElizaService, {
// rpc Say'i uygular
async say(req) {
return {
sentence: `Söylediniz: ${req.sentence}`
}
},
});
Hepsi bu! Bir hizmeti uygulamanın birçok farklı alternatifi var ve başlıklar ve dosya parçaları için bir bağlam nesnesine erişiminiz var, ancak şimdilik basit tutalım.
Bir sunucu başlatma
Connect hizmetleri, vanilla Node.js sunucularına, Next.js, Express veya Fastify ile entegre edilebilir. Burada Fastify kullanacağız. Hızlı bir değişiklik yapalım ve Fastify için eklentimizi yükleyelim:
$ npm install fastify @connectrpc/connect-node @connectrpc/connect-fastify
Yeni bir server.ts
dosyası oluşturun ve aşağıdaki içeriği ekleyin:
import { fastify } from "fastify";
import { fastifyConnectPlugin } from "@connectrpc/connect-fastify";
import routes from "./connect";
async function main() {
const server = fastify();
await server.register(fastifyConnectPlugin, {
routes,
});
server.get("/", (_, reply) => {
reply.type("text/plain");
reply.send("Merhaba Dünya!");
});
await server.listen({ host: "localhost", port: 8080 });
console.log("sunucu,", server.addresses(), "adresinde dinliyor.");
}
// Eğer package.json dosyanızda type: module ayarlarsanız,
// main() sarıcıyı kaldırabilir ve tsconfig.json'unuzu target: es2017 ve module: es2022 ile güncelleyebilirsiniz.
void main();
Tebrikler. Uç noktanız hazır! Sunucunuzu başlatmak için:
$ npx tsx server.ts
İstek gönderme
Yeni API'nizi tüketmenin en basit yolu, JSON yükü ile bir HTTP/1.1 POST'tur. En son sürüm cURL yükü kuruluysa, bu bir tek satırlık komut:
$ curl \
--header 'Content-Type: application/json' \
--data '{"sentence": "Mutlu hissediyorum."}' \
http://localhost:8080/connectrpc.eliza.v1.ElizaService/Say