koajs / koa Goto Github PK
View Code? Open in Web Editor NEWExpressive middleware for node.js using ES2017 async functions
Home Page: https://koajs.com
License: MIT License
Expressive middleware for node.js using ES2017 async functions
Home Page: https://koajs.com
License: MIT License
https://github.com/koajs/koa/blob/master/lib/application.js#L62 currently returning server.listen()
, thoughts?
so shit doesn't explode
right now, app.onerror
is added to the the error
event listener automatically. what happens if users don't want to use it? doing app.removeListener('event', app.onerror
)` is a little annoying. instead i suggest the following:
app.onerror
app.outputErrors
app.callback()
stage, warn/throw if no event listeners have been addedapp.callback = function(){
// ...
if (!app.listeners('error')) {
if (this.env === 'development') {
console.warn('You should add your own error handler.');
app.on('error', function(err) {
console.error(err.stack);
})
} else if (this.env !== 'test') {
throw new Error('Add your own error handler!');
}
}
return function(req, res){
// ..
})
or, another way to say it is to convert the body to a respondable type: buffer, stream, or string. generally, this should only be used in upstream middleware. we can make it private so people don't abuse it.
this way, we can avoid doing: https://github.com/koajs/compress/blob/master/index.js#L69
will do this after #67
not sure what's up with this, it wont let me edit the home page https://github.com/koajs/koa/wiki
seems like we can't really wrap just one stream so we may want to consider this, knocks a good 1000rps off but eh. seems a little tricky to do with middleware since we have to terminate it lower, similar issue to the compress middleware
such as https://github.com/senchalabs/connect/blob/master/lib/utils.js#L61
so you can do something like
this.error(404)
vs.
var err = new Error()
err.status = 404
this.error(err)
this.response.lastModified = Date()
- since i'm too lazy to do this.set('Last-Modified', new Date().toUTCString())
. plus we can normalize people's date strings.this.response.etag = '12345'
- wrap the etag in "
s if not already.this.response.link()
this.response.location()
most of the other stuff i can think of are already handled by higher level stuff. or people won't use. if you don't have any opinions on these, i will implement them after you implement this.response
and this.request
.
no one remembers to do this by default and node explodes
does basic auth really need to be in core?
add tests, content-typ, content-length, transfer-encoding
need to look into this, some errors aren't being caught
so it has the same middleware signature as connect/express
maybe
In general I don't like this for the average use-case and "hot" methods, but I do prefer this.request.etag
to this.get('ETag')
, this.request.length
, this.response.length
, this.response.header
etc, but the common cases we have would delegate: this.body = foo
== this.response.body = foo
. something to think about
would be more organized
or similar, less ugly name would be nice but meh
when header isn't sent
instead of yield next
? so used to next() in connect that it mind-fucks me a bit
since we will have app.context()
, app.request()
, and app.response()
, i guess we should have something like app.mixin()
where you can do:
app.mixin({
context: {},
request: {},
response: {}
})
so you can do with a plugin:
app.mixin(require('koa-context-something'))
maybe app.plugin()
. maybe a different, better name. also, an app.inherit(parentapp)
would be nice as well, especially if you mount apps.
instanceof Stream is lame
with some design decisions etc
i personally don't like qs. would be nice if you removed it as a dep and used the native querystring
module in core, then moved qs to a separate repo.
update the year to 2013. Also, you should add the repository field to package.json.
Like this
app.use(function *(next) {
var start = new Date;
yield next;
var ms = new Date - start;
console.log('%s %s - %s', this.method, this.url, ms);
});
Is there a reason for that?
if we end up going with the dispatcher this will be simple
in libs but add a few methods here, so common
more common shit, all as wrappers for vanilla node libs when appropriate.
app.keys = new Keygrip
or sth
would be nice if koa didn't touch the original req/res. since we're building a wrapper around them, i don't see why it would be necessary.
example is:
/**
* Set request URL.
*
* @api public
*/
set url(val) {
this.req.url = val;
},
Wish it were something else like:
get url() {
return this._url || this.req.url
},
set url(val) {
this._url = val
}
since we kind of expect developers to attach their own properties to context
, it may be nice to warn when a property is overwritten. this is to avoid conflicts with different plugins/extensions/etc. we can also do something like app.context(obj, dontWarnMe)
where dontWarnMe
is a Boolean
and default true
during development.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.