Hi Alexander,
Thanks a lot for the detailled answer! I completely understand what you're
saying. I've been following the JIRA issues COUCHDB-430, COUCHDB-514 etc.
for years, since this redirect topic was one of the first obstacles I ran
into when starting to use CouchDB.
Nevertheless I still don't get a valid redirect, even with start(). It's a
bit embarrassing that I can't get a simple _list function right... ;-)
I put this design doc into a new database "redirect":
{
"_id": "_design/redirect",
"views": {
"all": {
"map": "function(doc) {\n\temit(doc._id, null);\n}"
}
},
"lists": {
"redirect": "function(head, req) {\n\tstart({\n\t\t\"code\":
302,\n\t\t\"headers\": {\n\t\t\t\"Location\": \"http://www.google.com
\"\n\t\t}\n\t});\n}"
}
}
The couchdb output when calling
http://localhost:5984/redirect/_design/test/_list/redirect/all
{"error":"unknown_error","reason":"undef"}
This is the couchdb.log output (level INFO):
[error] [<0.20382.0>] Uncaught error in HTTP request: {error,undef}
[info] [<0.20382.0>] Stacktrace: [{undefined,write_chunk,[[]],[]},
{couch_httpd,last_chunk,1,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
{line,692}]},
{couch_mrview_show,list_cb,2,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couch_mrview/src/couch_mrview_show.erl"},
{line,254}]},
{couch_mrview,finish_fold,2,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couch_mrview/src/couch_mrview.erl"},
{line,339}]},
{couch_query_servers,with_ddoc_proc,2,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_query_servers.erl"},
{line,269}]},
{couch_httpd,etag_maybe,2,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
{line,600}]},
{couch_httpd_db,do_db_req,2,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd_db.erl"},
{line,234}]},
{couch_httpd,handle_request_int,5,
[{file,
"/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
2Fgit-wip-us.apache.org
%2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
{line,332}]}]
[info] [<0.20382.0>] 127.0.0.1 - - GET
/redirect/_design/redirect/_list/redirect/all 500
[error] [<0.20382.0>] httpd 500 error response:
{"error":"unknown_error","reason":"undef"}
Is this a bug, or am I still missing something?
Regards,
Bernhard
2013/9/18 Alexander Shorin <[email protected]>
> Hi Bernhard,
>
> you need to send redirect with start() function call.
>
> function(head, req) {
> start({"code": 301, "headers": {"Location": "http://google.com"}});
> }
>
> http://docs.couchdb.org/en/1.4.x/query-servers.html
>
> Why so? start() function allows to send custom HTTP headers to the
> client before any response (or with first chunk of it). When you
> return or send() something before or without start() call, query
> server implicitly called it with empty object payload which means that
> CouchDB will send default HTTP status code and headers. Since CouchDB
> sends response of list functions as chunked transfer, it doesn't
> buffers all of it to let you change HTTP response status or headers
> somewhere in the middle - what's why you need to define them in first
> place and start() function explicitly points on this.
>
> For show functions your code will work since they produces only one
> response object which contains response body and optionally may have
> HTTP status and headers. With a little adaptation, the same is true
> for update functions too.
>
> --
> ,,,^..^,,,
>
>
> On Tue, Sep 17, 2013 at 5:34 PM, Bernhard Gschwantner
> <[email protected]> wrote:
> > Hello,
> >
> > I tried to redirect from a _list function without success. This code
> throws
> > a badarg error in CouchDB 1.4.0 (also in 1.2 and 1.3):
> >
> > function(head, req) {
> > return {
> > code : 301,
> > headers : {
> > Location : 'http://www.google.com'
> > }
> > };
> > }
> >
> > Is there something I am doing wrong or missing?
> >
> > The real-world use case is that we have several aliases to each document
> in
> > the db, and all those aliases should be redirected to the real document
> id.
> > We use a view to emit the aliases and a list function to redirect all
> those
> > aliases to the real url.
> >
> > We've been working around the previous issues with modifying headers
> after
> > getRow() by redirecting through JavaScript, but want to get rid of this
> > workaround eventually.
> >
> > Regards,
> > Bernhard
> >
> > --
> >
> > Bernhard Gschwantner
> > Unser Wein G&U OG
> > Kirchengasse 13/7, 1070 Wien
> >
> > mobil: +43 (6991) 971 32 96
> > tel: +43 (1) 971 32 95
> > e-mail: [email protected]
> > twitter: @bernharduw <http://twitter.com/bernharduw>
> > web: www.unserwein.at
>
--
Bernhard Gschwantner
Unser Wein G&U OG
Kirchengasse 13/7, 1070 Wien
mobil: +43 (6991) 971 32 96
tel: +43 (1) 971 32 95
e-mail: [email protected]
twitter: @bernharduw <http://twitter.com/bernharduw>
web: www.unserwein.at