2

我无法通过更新处理程序发布到 CouchDB,我不知道我做错了什么。以下是长篇描述。

我使用 erica 创建了一个应用程序,详细信息主要来自 wiki。它工作得很好,直到我决定去发布,但是服务器端,通过根据Apache CouchDB wiki Working_with_Forms的更新处理程序

我用 erica 创建了一个新的“webapp”,构建了一个索引(从 wiki 剪切-n-粘贴,稍作改动):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Minimal Form</title>
</head>

<body>
<div id="contact-form">
  <form id="contact" method="post" action="/mydatabase/_design/mydesigndoc/_update/postForm" enctype="multipart/form-data">
    <fieldset>
        <label for="name">name</label>
        <input type="text" name="name" placeholder="Full Name" title="Enter your name" class="required">

        <label for="phone">phone</label>
        <input type="tel" name="phone" placeholder="+1 (555) 555-5555" required="" pattern="\+?[0-9 )(-]+">

        <label for="email">e-mail</label>
        <input type="email" name="email" placeholder="you@example.org" title="e-mail address" class="required email">

        <label for="blog">blog</label>
        <input type="url" name="url" placeholder="http://">

        <label for="message">message</label>
        <textarea name="message"></textarea>

        <input type="submit" name="submit" class="button" id="submit" value="submit">
    </fieldset>
  </form>
</div>

我将表单属性更改action=为:htttp://localhost:5984/DBNAME/_design/DESIGNDOCID/_update/UPDATENAME并添加了enctype="multipart/form-data".

然后_design根据 wiki 构建了一个文档,如下所示:

{
updates: {
    postForm: function(previous, request) {

        /* during development and testing you can write data to couch.log
    log({"previous": previous})
    log({"request": request})
    */
    var doc = {}
    if (!previous) {
            // there's no existing document _id as we are not using PUT
            // let's use the email address as the _id instead
            if (request.form && request.form.email) {
                // Extract the JSON-parsed form from the request
                // and add in the user's email as docid
                doc = request.form
                doc._id = request.form.email
            }
        }
        return [doc, toJSON({
            "request": request,
            "previous": previous,
            "doc": doc
        })]
    }
}
}

这被放置在“ddoc”文件夹中,用erica推送应用程序,根据链接打开网页,找到表单但是当它被提交时,这是我得到的答案:

{"error":"unnamed_error","reason":"(new TypeError(\"point is undefined\", \"/usr/share/couchdb/server/main.js\", 1475))"}

我摆弄了 action="..." 属性,甚至像这样放置绝对地址:

http://localhost:5984/mydatabase...

我已将 toJSON() 替换为 JSON.stringify()。

我已经重新启动了这个过程并重新完成了这个项目。无济于事。

我有一种明显的感觉,我已经“失明”了,解决方案可能就在我眼前,但我看不到它。似乎POST-http-request没有问题,因为我之前尝试过AJAX(忘记“content-type”)时服务器已经抱怨过,但这次似乎是内部服务器问题。我不知道。真的。

总而言之,问题是:有人可以帮助我吗?请。

4

2 回答 2

2

我将回答我自己的问题,同时请求那些浪费时间的人的原谅。

我所做的是我通读了kanso并理解了范围的概念如何适用于这种情况。这是exports在更新处理程序上使用的问题,因此可以通过<form action="/database/_design/designDocument/_update/updateFunction.

为什么我没有早点通读 Kan.so?好吧,我下定决心要保持简单——erica作为我的继任者,couchapp我认为坚持基础知识是一个合理的举措。虽然我必须说文档很少,但是通过阅读 Kan.so 来揭开 couchapp 构建的魔力,除此之外,我还了解了其他一些漂亮的概念和技术。我弯下脖子表示感谢。

我希望所有那些花时间阅读我冗长的,事实证明,不必要的问题的人都会因为我的无知而监督。

(现在我只是想知道是否有某种管理员/版主可以处理我的作品以避免将来的 timel oss)

于 2013-07-30T20:25:09.257 回答
2

我也遇到了这个错误,正如@Pea-pod 所暗示的那样,导致它的原因是exports在 couchapp 的设计文档中没有正确定义你的。在我们的例子中,它是无法调用的列表函数,而是在 couchdb 日志中显示 500Type error错误point is undefined

我们使用kanso并且在 app.js 中我们不需要列表文件。我们有:

module.exports = {
    rewrites: require('./rewrites'),
    views: require('./views'),
    shows: require('./shows')
};

将其更改为以下解决了该问题:

module.exports = {
    rewrites: require('./rewrites'),
    views: require('./views'),
    shows: require('./shows'),
    lists: require('./lists')
};

我是否可以建议版主更改此问题的标题,以包括point is undefined发生此类错误时 CouchDB 日志中显示的错误,以帮助其他人更轻松地找到它?

于 2014-01-26T11:18:23.060 回答