tomphttp / bare-server-node

TompHTTP Bare server in the Node runtime
GNU General Public License v3.0
72 stars 122 forks source link

Error: Unable to fetch Bare meta: 404 Not Found #15

Closed gagedevs closed 1 year ago

gagedevs commented 1 year ago
const Koa = require('koa');const app = new Koa();
const port = 80;
const http = require('node:https')
const createBareServer = require('@tomphttp/bare-server-node');
const colors = require('./colors.js');
var logger = require('koa-logger');
const sendfile = require('koa-sendfile')
const bare = createBareServer('/bare/')

app.on('request', (req, res) => {
    if (bare.shouldRoute(req)) {
        bare.routeRequest(req, res)
    } else {
        app(req, res)
    }
})
app.on("error", err => console.log(err));
app.on('upgrade', (req, socket, head) => {
    if (bare.shouldRoute(req)) {
        bare.routeUpgrade(req, socket, head)
    } else {
        socket.end()
    }
});

I am using Koa.js to try and update my backend, and this code works with Express. It shows the following error in inspect element:

uv.sw.js:1 Error: Unable to fetch Bare meta: 404 Not Found
    at Sh (BareClient.ts:132:9)
    at async Ih.request (BareClient.ts:230:3)
    at async Ih.fetch (BareClient.ts:364:10)
    at async s.fetch (uv.sw.js:1:1725)

If I try and change app to httpsServer, it shows "Cannot set headers after they are sent to the client.` in the terminal, instead of inspect element.

const options = {
    key: key,
    cert: cert
}
const httpsServer = https.createServer(options, app.callback()); // adds koa.js app to https server
const bare = createBareServer('/bare/')

httpsServer.on('request', (req, res) => {
    if (bare.shouldRoute(req)) {
        bare.routeRequest(req, res)
    } else {
        app(req, res)
    }
})
httpsServer.on("error", err => console.log(err));
httpsServer.on('upgrade', (req, socket, head) => {
    if (bare.shouldRoute(req)) {
        bare.routeUpgrade(req, socket, head)
    } else {
        socket.end()
    }
});
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:393:5)
    at ServerResponse.setHeader (node:_http_outgoing:644:11)
    at writeResponse (C:\Users\shuttle\Downloads\shuttle test\node_modules\@tomphttp\bare-server-node\dist\AbstractMessage.js:46:13)
    at Server.routeRequest (C:\Users\shuttle\Downloads\shuttle test\node_modules\@tomphttp\bare-server-node\dist\BareServer.js:163:48)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

Is Koa.js not supported or am I doing something wrong? Tell me if you need more information

CountBleck commented 1 year ago

Do you know how to use Koa?

CountBleck commented 1 year ago

You should try reading https://koajs.com/. It looks like they don't want you to use ctx.res.write() (for instance) and want you to use their own Request/Response objects. Therefore, bare-server-node can't properly/fully support Koa. You could try passing ctx.req and ctx.res to Bare though. Regardless, you're not even using Koa properly.

If you don't need any Koa-specific middleware, then use Express.

Edit: if you don't need any routing and you don't need any middleware other than serving static files, you could also use Node.js's vanilla, builtin HTTP server and use serve-static, which is what Express uses for express.static().

gagedevs commented 1 year ago

This isn't my full code, and yes I am using Koa properly. To use HTTPS with Koa (if that's what you're talking about), you need to create an httpsServer and their docs say that app.listen() is just httpServer.createServer(app.callback()).listen(). Other than that (and bare), all other imports are official Koa libraries. Thanks for letting me know that though, and I also just tried using Koa yesterday, so I am probably doing some stuff wrong.

CountBleck commented 1 year ago

@oHeckGage I was actually looking at your app.on('request') stuff, which either doesn't work in Koa or defeats the point of Koa.