He estado atascado en mi servidor Koa por un tiempo. Parece que estoy muy cerca, simplemente parece que no puedo terminarlo por completo.
Cada vez que quiero publicar algo en mi base de datos de mensajes, se bloquea y dice que la topología está cerrada.
Actualmente estoy agregando archivos json muy básicos a través del cartero con una propiedad msg e id, espero que alguien con más experiencia pueda ayudarme a resolver esto. Definitivamente sería muy apreciado.
const Koa = require("koa"); const bodyparser = require("koa-bodyparser"); const KoaRouter = require("koa-router"); const { MongoClient } = require('mongodb'); const url = 'mongodb://localhost:27017/'; const app = new Koa(); const router = new KoaRouter(); const client = new MongoClient(url); const db = client.db('serverTesting'); const messages = db.collection("messsages") const PORT = 3002; app.use(bodyparser()) // router app.use(router.routes()); router.get("/", ctx => { ctx.body = "Hello, this is the Homepage."; }); router.get("/test", ctx => { ctx.body = { msg: "Hello Test"}; }); router.post("/test", ctx => { const message = ctx.request.body; messages.insertOne(message); ctx.body = "Message was updated." console.log("Added message to database: ") console.log(messages); }); router.delete("/test", ctx => { const msg = ctx.request.body.msg; const deleted = messages.find(message => message.msg === msg); if (deleted) { messages = messages.filter(message => message.msg !== msg); console.log("Deleted message from database: ") console.log(messages) ctx.body = "Message was deleted." } else { ctx.body = "This message was not found in the database" } }) router.put("/test", ctx => { const id = ctx.request.body.id; const deleted = messages.find(message => message.id === id); if (deleted) { messages.forEach(message => { if (message.id === id) { message.msg = ctx.request.body.msg } }) console.log("Updated message in database: ") console.log(messages) ctx.body = "Message was updated." } else { ctx.body = "This message was not found in the database" } }) app.listen(PORT, () => { client.connect() console.log(`Server running on http://localhost:${PORT} 🚀`); })No sé exactamente cuál es el problema con su código porque funcionó para mí, tal vez tenga algo que ver con la configuración de su base de datos.
Estoy sugiriendo un ejemplo de trabajo y puedes probarlo por tu cuenta.
Supongo que tiene Docker y Curl en su sistema.
docker-compose.yaml
version: '3.1' services: mongo: image: mongo restart: always ports: - "27077:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example mongo-express: image: mongo-express restart: always ports: - "8077:8081" environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ Cree docker-compose.yaml y ejecute docker compose up . Esto hará que Mongo Express se ejecute en el puerto 8077 y la propia base de datos en el 27077 .
índice.js
const Koa = require("koa"); const bodyparser = require("koa-bodyparser"); const KoaRouter = require("koa-router"); const { MongoClient } = require("mongodb"); (async () => { const PORT = 3002; const url = "mongodb://root:example@127.0.0.1:27077/"; const client = await new MongoClient(url).connect(); const db = client.db("my-database"); const messages = db.collection("messages"); const app = new Koa(); const router = new KoaRouter(); app.use(bodyparser()); app.use(router.routes()); router.post("/create", async (ctx) => { const message = ctx.request.body; await messages.insertOne(message); ctx.body = "DB record created"; }); app.listen(PORT, "0.0.0.0", () => { console.log(`Server running on http://127.0.0.1:${PORT} 🚀`); }); })(); Ejecute el servidor con el node index.js y envíe la carga útil para probarlo
curl --location --request POST 'http://localhost:3002/create' \ --header 'Content-Type: application/json' \ --data-raw '{ "message": "hello there", "data": "This is me!" }'Puede navegar a http://localhost:8077/ y verificar el valor creado.